国際化対応について
従来の C や C++ のコードのほとんどは、国際市場を考慮したアプリケーション開発を想定していないため、文字や文字列の操作で不具合が出ます。MFC もランタイム ライブラリも Unicode または MBCS をサポートしていますが、まだ対応不十分です。ここでは、Visual C++ における "国際化対応" の内容を解説します。
Unicode と MBCS の機能はいずれも、MFC 関数のパラメーター リストと戻り値の型に移植性の高いデータ型を採用することで実現されています。これらの型は、ビルドのときに定義するシンボル _UNICODE または _MBCS (つまり DBCS) に応じて定義されます。このシンボルに対応するバージョンの MFC ライブラリが自動的にアプリケーションにリンクされます。
クラス ライブラリのコードでは、移植性のあるランタイム関数を使用するなどして、Unicode や MBCS が正常に機能することを保証しています。
プログラミング レベルでは、次のような国際化のための作業が必要となります。
移植性のある同じランタイム関数を使用して、MFC がいずれの環境でも移植できるようにします。
_T マクロを使い、リテラル文字列や文字がいずれの環境でも移植できるようにします。詳細については、「Tchar.h における汎用テキストのマッピング」を参照してください。
MBCS に従って文字列を解析する場合は注意が必要です。Unicode では特に注意する必要はありません。詳細については、この章の「MBCS のプログラミングについて」を参照してください。
アプリケーションで ANSI (8 ビット) と Unicode (16 ビット) の文字を混在させて使う場合には注意が必要です。プログラムのある部分で ANSI 文字を使い、また別の部分で Unicode 文字を使うことはできますが、同じ文字列の中に混在させることはできません。
アプリケーション内で文字列をハードコーディングしないでください。文字列は、アプリケーションの .rc ファイルに追加して、STRINGTABLE リソースにします。この結果、アプリケーションをローカライズするときに、ソース コードの変更や再コンパイルが不要になります。STRINGTABLE リソースの詳細については、「ストリング エディター」を参照してください。
[!メモ]
ヨーロッパの文字セットや MBCS 文字セットには、アクセント記号付き文字など、0x80 より大きな文字コードに対応する文字があります。ほとんどのコードで符号付き文字を採用しているため、このような 0x80 より大きな文字は int 型整数に変換されると符号拡張されます。符号拡張された文字は負となり、配列のインデックスに使用すると、配列の外側にインデックスを作成するため、問題が発生します。日本語などの MBCS を使う言語も固有の問題を抱えています。文字は 1 バイトまたは 2 バイトで構成される可能性があるため、常に両方のバイトを同時に操作する必要があります。