Unicode とマルチバイト文字セット (MBCS: Multibyte Character Set) のサポート
日本語や中国語などの一部の言語は巨大な文字セットを扱います。 これらの言語に対応するために Microsoft Foundation Class ライブラリ (MFC) では巨大な文字セットを処理する 2 つの機能が用意されています。
Unicode、
wchar_t
ベースのワイド文字、および UTF-16 としてエンコードされた文字列。マルチバイト文字セット (MBCS)は、ロケール固有の文字セットでエンコードされた
char
ベースのシングルまたはダブルバイトの文字および文字列です。
Note
Microsoft では、すべての新しい開発に MFC Unicode ライブラリを使用することをお勧めします。
MBCS ライブラリは、Visual Studio 2013 および Visual Studio 2015 で非推奨になりました。 この点は変更されました。
Visual Studio 2017 以降、MBCS ライブラリは非推奨になり、非推奨の警告は生成されません。
MFC がサポートする Unicode 文字列
MFC クラス ライブラリ全体で、UTF-16 としてワイド文字で格納された Unicode 文字および文字列が条件付きで有効になります。 特に、CString
クラスは Unicode に対応しています。
MFC で Unicode をサポートするには、次のライブラリ、デバッガー、DLL ファイルを使用します。
MFC<バージョン>U.LIB
MFC<バージョン>UD.LIB
MFCM<バージョン>U.LIB
MFCM<バージョン>UD.LIB
MFCS<バージョン>U.LIB
MFCS<バージョン>UD.LIB
UAFXCW.LIB
UAFXCWD.LIB
MFC<バージョン>U.PDB
MFC<バージョン>UD.PDB
MFCM<バージョン>U.PDB
MFCM<バージョン>UD.PDB
MFCS<バージョン>U.PDB
MFCS<バージョン>UD.PDB
UAFXCW.PDB
UAFXCWD.PDB
MFCversionU.DLL
MFC<バージョン>UD.DLL
MFCMversionU.DLL
MFCMversionUD.DLL
(<バージョン> はファイルのバージョン番号を表します。たとえば、"140" は Version 14.0 を表します。)
CString
は、TCHAR
データ型に基づいています。 プログラムをビルドするときに _UNICODE
シンボルが定義されている場合、TCHAR
は、16 ビット文字エンコードの wchar_t
型として定義されます。 それ以外の場合、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 を適切に処理します。
「ランタイム ライブラリ リファレンス」では、文字列処理関数のすべてについて移植性が高いバージョンを定義しています。 詳細については、「国際化」のカテゴリを参照してください。
MFC がサポートする MBCS 文字列
このクラス ライブラリではマルチバイト文字セットもサポートされていますが、サポートされているのは、2 バイト文字セット (DBCS: Double-Byte Character Sets) のみです。
マルチバイト文字セットでは、文字の幅は 1 バイトまたは 2 バイトです。 幅が 2 バイトの場合、最初のバイトは、使用されているコード ページに応じて、特定の範囲から選択される特殊な "リード バイト" です。 先行バイトと 2 バイト目の "後続バイト" を組み合わせると、そのコードが表す文字が決まります。
プログラムをビルドするときに _MBCS
シンボルが定義されていると、TCHAR
型 (CString
はこの型に基づいています) は char
型にマップされます。 CString
内のどのバイトが潜在顧客バイトで、どのバイトが証跡バイトであるかを判断するのはユーザーの判断です。 この判定用の関数は C ランタイム ライブラリで定義されています。
DBCS では、文字列の中に任意の ANSI の 1 バイト文字と 2 バイト文字を混在させることができます。 したがって、DBCS では文字列の解析時に特別な注意が必要です。 このようなリソースとして、CString
オブジェクトがあります。
Note
MFC における Unicode 文字列のシリアル化は、Unicode 文字列と MBCS 文字列の両方について、どちらのバージョンのアプリケーションを使用しているのかを考慮せずに読み込むことができます。 データ ファイルはプログラムの Unicode 版と MBCS 版の間で移植性があります。
CString
のメンバー関数は、特別な "汎用テキスト" バージョンの C ランタイム ライブラリ関数を使用します。つまり、Unicode 対応の関数を使用します。 したがって、たとえば、CString
のメンバー関数が通常 strcmp
を呼び出す場所では、代わりに "汎用テキスト" 関数 _tcscmp
を呼び出します。 シンボル _MBCS
および _UNICODE
の定義状況に応じて、_tcscmp
は次のようにマップされます。
シンボル | 機能 |
---|---|
_MBCS が定義されている |
_mbscmp |
_UNICODE が定義されている |
wcscmp |
どちらのシンボルも定義されていない場合 | strcmp |
Note
シンボル _MBCS
と _UNICODE
は同時に使用できません。
すべてのランタイム文字列処理ルーチンに対する汎用テキスト関数マッピングについては、「ランタイム ライブラリ リファレンス」を参照してください。 一覧については、「国際化」を参照してください。
同様に、各種の CString
メソッドも、"汎用" のデータ型マッピングを使用して実装されます。 MBCS と Unicode の両方を有効にするために、MFC では char
または wchar_t
の代わりに TCHAR
、char
* または wchar_t*
の代わりに LPTSTR
、const char
* または const wchar_t*
の代わりに LPCTSTR
を使用しています。 これによって、MBCS または Unicode への正しいマッピングが確保されます。