2009-08-11 28 views
2

私はアプリケーションをWindowsに移植しています。プログラムで(C/C++)Linuxで国コードを取得する方法は?

私はそのようなコードを持っている:


char buffer[32] = {0}; 

if (GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_ICOUNTRY, buffer, _countof(buffer))) 
{ 
    std::string newPrefix(buffer); 
    if (!newPrefix.empty() && (newPrefix != "-1")) 
    { 
     countryPrefix_ = newPrefix; 
    } 
} 

私はUSA &カナダ例えば(「1」「国際電話コードに基づいて、国/地域コード、」リターン機能を必要とし、「61」のためにオーストラリアなど)
国は、Windowsで(OS」日付/時刻の設定から取得する必要があります。コントロールパネル - 地域&言語オプション)。

+0

Linuxは、国の代わりに、時間帯によって、それを持っているでしょう、なぜ?それはあまりにも複雑なようです。この方法がうまくいくのではないかと思います。 もう一度、私はWindowsによって甘やかされています。 – jkeys

+0

ところで、なぜあなたのコードでchar *とstd :: stringを切り替えるのですか? – jkeys

+0

@Hooked 私は、生のcharバッファの代わりにSTLを使用することを好みます。 – Dmitriy

答えて

4
  • Unix用のOSワイドロケール設定はありません。上書きしないユーザーにはデフォルトが使用できますが、ほとんどのユーザーは上書きします。そしてそれを "C"のままにしておくのが一般的です。

  • 必要な情報を取得するための標準的なCまたはC++方法はありません。

  • ロケールに関連する情報を取得するposix方法は、ロケールを設定し、nl_langinfo()(これはchar*を返します)を使用することです。国際電話コードのPOSIXマクロは定義されていませんが、glibcにはその拡張子(_NL_TELEPHONE_INT_PREFIX)があります。

例:

#include <langinfo.h> 
... 
if (setlocale(LC_ALL, "") == NULL) { 
    fprintf(stderr, "Unable to set locale.\n"); 
    abort(); 
} 
printf("Telephone international prefix: %s\n", nl_langinfo(_NL_TELEPHONE_INT_PREFIX)); 
+0

ユーザーが上書きしたとか、 "C"のままにしておくことが非常に一般的だと言うと、私はそれに同意しません。あなたが非英語圏の国から来たときはそうではありません。 OSをインストールすると、ロケールはfr_FRのように正しく設定されます。通常、ユーザーはそれを変更しないので、システムコールを要求するときに正しいロケールが得られます。ところで+1あなたの良い答え;) – neuro

+0

私たちはサーバー上のCとワークステーションのfr_FRに持っています。サーバにログインする際には、正しい環境変数を設定していますが、一部の環境変数をリセットしてローカライゼーションの一部のみを取得することは遠いです(エラーメッセージの翻訳は面白いですが、混乱します)。私は、同じことをやっている顧客がいることを知っています(フランス語をドイツ語、またはフィニッシュまたはロケールに置き換える)。だから私はどこから来たのか共通しているようだ。そして、明らかに、デフォルトとOSを区別し、デスクトップのGUIからデフォルトを区別しなければならない。 Unixは死に設定可能です! – AProgrammer

関連する問題