Linuxの下でC++国際化


国際化について
アプリケーションの国際化の本質は、環境変数やプロファイルに基づいてプログラムの動作を指導できるメカニズムを提供することです.新しい「国」をサポートする場合、コードを変更することなく、リソースファイルのみを変更できます.
例えば、「LANGをCにし、viで中国語のファイルを開き、中国語で文字化けして表示する」.viがLANGによって何らかの操作をしたからだ.
Linuxでは、国際化に関連するlocale環境変数には、LC_の3種類があります.ALL,LC_*(LC_CTYPEなど)、LANG.
man 7 localeの定義によると、この3つの優先度はLC_ALL>LC_*>LANG、すなわちLC_ALL定義の内容はLC_*を上書きします.とLANGの、LC_*LANGをカバーします.
locale変数のフォーマットは(ネット上の資料を参照):
言語[_地域][.文字セット][@修正値]
例:
1、私は中国語を話して、中華人民共和国にいて、国標2312文字セットを使って文字を表現します.zh_CN.GB 2312=中国語_中華人民共和国+国標2312文字セット.2、私は中国語を話して、中華人民共和国にいて、国標18030文字セットを使って文字を表現します.zh_CN.GB 18000=中国語_中華人民共和国+国標18000文字セット.3、私は中国語を話して、中華人民共和国台湾省にいて、国標Big 5文字セットを使って文字を表現します.zh_TW.BIG 5=中国語_台湾最大5文字セット.4、私は英語を話して、ブリテンにいて、ISO-8859-1文字セットを使って文字を表現します.en_GB.ISO-8559-1=英語_ブリテンISO-8559-1文字セット.5、私はドイツ語を話して、ドイツにいて、UTF-8文字セットを使って、ヨーロッパ風に慣れました.de_DE.UTF-8@euro=ドイツ語_ドイツUTF-8文字セット@ヨーロッパの習慣に従って修正します.
コマンドlocaleを使用して、ユーザーの現在のlocale構成を表示できます.
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

アプリケーションは、国際化の問題を処理するために、独自の環境変数またはプロファイルを定義することもできます.例えばoracleのNLS_LANGUAGE.
 
C++における国際化
C++はlocaleクラスを使用して国際化の問題を処理します.
たとえば
1)ドイツ語形式で数値を出力するには:
//de_num.cpp
#include <iostream>
#include <locale>
 
using namespace std;
 
int main()
{
     int a =1234567;
     cout<< a << endl;
     localel("de_DE.UTF-8");
     cout.imbue(l);
     cout<< a << endl;
     return 0;
}

結果:
1234567
1.234.567
すなわちドイツ語フォーマット用である.を選択します.
 
2)ユーザー環境変数の情報を得る:
//get_user_locale.cpp
#include <iostream>
#include <locale>
 
using namespace std;
 
int main()
{
     //createthe default locale from the user's environment
     localel("");
     cout<< l.name() << endl;
     return 0;
}

結果
en_US.UTF-8
 
3)cout.imbue(locale(""));imbueを設置しないのとは違います
cout.imbue(locale(""));//ユーザーの環境変数に従ってlocaleを作成しcoutを設定
coutに相当するものは設けない.imbue(locale("C"));
localeの詳細な使い方は『The C++Standard Library』14章を参照してください.
charとwchar_t
charはC++のマルチバイト表現です.linuxの下のcharはUTF-8形式で、長くなります.
wchar_tはC++におけるワイドバイト表現である.linuxの下のwchar_tはUTF-32形式で、定長で4バイトを占めています.
マルチバイトは一般的にプログラムの外部にデータを格納するために使用され、スペースを節約することができます.ワイドバイトは一般的にプログラムの内部にデータ(内蔵中)を格納し、プログラム処理を容易にする.
linuxではwcharの使用は奨励されていないようです.t、わけのわからない問題がある.
たとえば、次のコードがあります.
//wcout.cpp
#include <iostream>
#include <locale>
#include <cstdlib>
 
using namespace std;
 
int main()
{
     locale::global(locale("zh_CN.UTF-8"));   //OK
     //wcout.imbue(locale("zh_CN.UTF-8"));         //Not OK
     constwchar_t * b = L"  ";
     wcout<< b << endl;
     return 0;
}

本の要求に従ってwcoutを設定する.imbueですが、正しく出力できません.しかしlocale::globalを設定することはできます.原因不明.