Unicode とマルチバイト文字セット (MBCS: Multibyte Character Set) のサポート
日本語や中国語などの一部の言語は巨大な文字セットを扱います。これらの言語に対応するために MFC では巨大な文字セットを処理する 2 つの機能が用意されています。
Unicode
マルチバイト文字セット (MBCS)
MFC がサポートする Unicode 文字列
MFC 全般で、条件を指定することで Unicode 文字および文字列が利用できます。CString クラスでは Unicode がサポートされています。
UAFXCW.LIB |
UAFXCW.PDB |
UAFXCWD.LIB |
UAFXCWD.PDB |
MFCxxU.LIB |
MFCxxU.PDB |
MFCxxU.DLL |
MFCxxUD.LIB |
MFCxxUD.PDB |
MFCxxUD.DLL |
MFCSxxU.LIB |
MFCSxxU.PDB |
MFCSxxUD.LIB |
MFCSxxUD.PDB |
MFCMxxU.LIB |
MFCMxxU.PDB |
MFCMxxU.DLL |
MFCMxxUD.LIB |
MFCMxxUD.PDB |
MFCMxxUD.DLL |
(xx はファイルのバージョン番号を表します。たとえば、80 は Version 8.0 を表します)。
CString は TCHAR データ型に基づいています。シンボル _UNICODE とプログラムのビルドに対して定義されている場合、TCHAR は、型 wchar_tの 16 ビット文字エンコードの型として定義されます。それ以外の場合、TCHAR は、通常の 8 ビット文字エンコードである char として定義されます。このため、Unicode を使用するときは、CString を 16 ビット幅の文字で構成します。Unicode を使用しないときは、char 型文字で構成します。
アプリケーションを Unicode 対応にするには、次のことも行う必要があります。
条件によってリテラル文字列を Unicode に移植するときは _T マクロを使用します。
文字列を引数として渡すときは、その関数が文字列の長さを文字数とバイト数のどちらで数えるのかを注意してください。Unicode 文字列を使用するときは、文字数とバイト数の長さが異なります。
C ランタイム ライブラリの文字列操作関数は Unicode 対応バージョンを使用してください。
文字および文字へのポインターには、以下の型を使用してください。
charを使用する場合TCHAR。
char*を使用する場合LPTSTR。
const char*を使用する場合LPCTSTR。CString には、CString と LPCTSTR を相互に変換するための、演算子 LPCTSTR が用意されています。
CString のコンストラクター、代入演算子、比較演算子は Unicode を適切に処理します。
Unicode プログラミングの関連情報については Unicode のトピックを参照してください。「ランタイム ライブラリ リファレンス」では、文字列処理関数のすべてについて移植性が高いバージョンを定義しています。「国際化」を参照してください。
MFC がサポートする MBCS 文字列
クラス ライブラリには、マルチバイト文字セットでは、2 バイト文字セット ((DBCS) に対してのみ有効になります。
マルチバイト文字セットでは、文字幅は一つのバイトです。2 バイト幅の文字では 1 バイト目が "先行バイト" になり、特定の範囲の文字を含むコード ページを指定します。先行バイトと 2 バイト目の "後続バイト" を組み合わせると、そのコードが表す文字が決まります。
プログラムをビルドするときに _MBCS シンボルが定義されていると、TCHAR 型 (CString はこの型に基づいています) は char 型にマップされます。_MBCS シンボルを定義したときは、CString 中のどのバイトが先行バイトであり、どのバイトが後続バイトであるかはプログラマが判定してください。この判定用の関数は C ランタイム ライブラリで定義されています。
DBCS では、文字列の中に任意の ANSI の 1 バイト文字と 2 バイト文字を混在させることができます。したがって、DBCS では文字列の解析時に特別な注意が必要です。このようなリソースとして、CString オブジェクトがあります。
[!メモ]
MFC における Unicode 文字列のシリアル化は、Unicode 文字列と MBCS 文字列の両方について、どちらのバージョンのアプリケーションを使用しているのかを考慮せずに読み込むことができます。データ ファイルはプログラムの Unicode 版と MBCS 版の間で移植性があります。
CString のメンバー関数は、特別な "汎用テキスト" バージョンの C ランタイム ライブラリ関数を使用します。つまり、Unicode 対応の関数を使用します。したがって、たとえば、CString のメンバー関数が通常 strcmp を呼び出す場所では、代わりに "汎用テキスト" 関数 _tcscmp を呼び出します。シンボル _MBCS および _UNICODE の定義状況に応じて、_tcscmp は次のようにマップされます。
_MBCS の定義 |
_mbscmp |
_UNICODE の定義 |
wcscmp |
どちらのシンボルも定義されていない場合 |
strcmp |
[!メモ]
シンボル _MBCS と _UNICODE は同時に使用できません。
すべてのランタイム文字列処理ルーチンに対する汎用テキスト関数マッピングについては、「C ランタイム ライブラリ リファレンス」を参照してください。特に、「国際化」を参照してください。
同様に、各種の CString メソッドについても、"汎用" のデータ型マッピングを使用して実装されます。MBCS および Unicode への対応を維持するために、MFC では char の代わりに TCHAR、char* の代わりに LPTSTR、const char* の代わりに LPCTSTR を使用しています。これによって、MBCS または Unicode への正しいマッピングが確保されます。