国際化対応について
従来の C および C++ コードのほとんどで、国際対応アプリケーションでは文字や文字列の処理がうまく機能しないと想定しています。 MFC とランタイム ライブラリはどちらも Unicode または MBCS をサポートしていますが、他にも対応することがあります。 このセクションでは、Visual C++ での "国際化対応" が意味するものを説明します。
Unicode と MBCS はどちらも、MFC 関数パラメーター リストの移植可能なデータ型と戻り型によって有効になります。 これらの型は、お使いのビルドがシンボル
_UNICODE
またはシンボル_MBCS
(DBCS を意味します) を定義しているかどうかに応じて、適切な方法を用いて条件付きで定義されます。 ビルドが定義する 2 つのシンボルに応じて、MFC ライブラリのさまざまなバリアントが、お使いのアプリケーションと自動的にリンクされます。クラス ライブラリ コードは、移植可能なランタイム関数やその他の方法を使用して、Unicode や MBCS が正常に動作することを保証します。
それでもなお、コード内で特定の種類の国際化タスクを処理する必要があります。
どちらの環境でも MFC を移植可能な状態にする、同じ移植可能なランタイム関数を使用します。
_T
マクロを使用して、リテラル文字列と文字をいずれかの環境で移植可能な状態にします。 詳細については、「tchar.h における汎用テキストのマッピング」を参照してください。MBCS で文字列を解析する場合は、予防措置を取る必要があります。 Unicode では、これらの予防措置は必要ありません。 詳細については、「MBCS のプログラミングについて」を参照してください。
お使いのアプリケーションで ANSI (8 ビット) と Unicode (16 ビット) の両方の文字を混在させる場合は注意が必要です。 プログラムの一部では ANSI 文字を使用し、他の部分では Unicode 文字を使用することはできますが、同じ文字列に混在させることはできません。
アプリケーションで文字列にハードコーディングを行わないでください。 代わりに、それらをアプリケーションの .rc ファイルに追加することで、STRINGTABLE リソースにします。 これにより、ソース コードの変更や再コンパイルを必要とせずに、アプリケーションをローカライズできます。 STRINGTABLE リソースの詳細については、「文字列エディター」を参照してください。
Note
ヨーロッパと MBCS の各文字セットには、アクセントの付いた文字などの、0x80 を超える文字コードを使用した文字が含まれています。 ほとんどのコードでは、符号付き文字が使用されるため、0x80 を超えるこれらの文字は、int
に変換される際に符号拡張が行われます。 これは、符号拡張文字 (負の値) が配列の外側にインデックスを作成するため、配列のインデックス作成に問題が生じます。 日本語など、MBCS を使用する言語もユニークです。 文字は 1 バイトまたは 2 バイトで構成される場合があるため、常に両方のバイトを同時に処理する必要があります。