Unicode とマルチバイト文字セット (MBCS: Multibyte Character Set) のサポート
日本語や中国語などの一部の言語は巨大な文字セットを扱います。 これらの言語に対応するために MFC では巨大な文字セットを処理する 2 つの機能が用意されています。
Unicode
マルチバイト文字セット (MBCS)
すべての新しい開発に Unicode を使用する必要があります。
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 は、16 ビット文字エンコードの wchar_t 型として定義されます。 それ以外の場合、TCHAR は、通常の 8 ビット文字エンコードである char として定義されます。 このため、Unicode を使用するときは、CString を 16 ビット幅の文字で構成します。 Unicode を使用しないときは、char 型文字で構成します。
アプリケーションを Unicode 対応にするには、次のことも行う必要があります。
条件によってリテラル文字列を Unicode に移植するときは _T マクロを使用します。
文字列を引数として渡すときは、その関数が文字列の長さを文字数とバイト数のどちらで数えるのかを注意してください。 Unicode 文字列を使用するときは、文字数とバイト数の長さが異なります。
C ランタイム ライブラリの文字列操作関数は Unicode 対応バージョンを使用してください。
文字および文字へのポインターには、以下の型を使用してください。
TCHAR 通常は char 型にするデータ。
LPTSTR 通常は char* 型にするデータ。
LPCTSTR 通常は const char* 型にするデータ。 CString には、CString と LPCTSTR を相互に変換するための、演算子 LPCTSTR が用意されています。
CString のコンストラクター、代入演算子、比較演算子は Unicode を適切に処理します。
Unicode プログラミングの関連情報については、「Unicode」を参照してください。 「ランタイム ライブラリ リファレンス」では、文字列処理関数のすべてについて移植性が高いバージョンを定義しています。 「国際化」を参照してください。
MFC がサポートする MBCS 文字列
注意
MBCS 文字列はレガシ テクノロジです。新しいプロジェクトにはお勧めしません。次の情報は、MBCS を使用する既存のコードの維持に必要なシナリオを対象としています。Unicode を使用するためのコードのアップグレードには適していません。
このクラス ライブラリではマルチバイト文字セットもサポートされていますが、サポートされているのは、2 バイト文字セット (DBCS: Double-Byte Character Sets) のみです。
セキュリティに関するメモ |
---|
Visual Studio 2013 以降では、MFC DLL の MBCS バージョンは、MSDN のダウンロード サイトから Visual Studio の無料のアドインとして入手できます。詳細については、MFC MBCS DLL アドインを参照してください。 |
マルチバイト文字セットでは、文字は 1 バイト幅または 2 バイト幅になります。 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 への正しいマッピングが確保されます。