Unicode とマルチバイト文字セット (MBCS: Multibyte Character Set) のサポート

日本語や中国語などの一部の言語は巨大な文字セットを扱います。 これらの言語に対応するために Microsoft Foundation Class ライブラリ (MFC) では巨大な文字セットを処理する 2 つの機能が用意されています。

  • Unicodewchar_t ベースのワイド文字、および UTF-16 としてエンコードされた文字列。

  • マルチバイト文字セット (MBCS)は、ロケール固有の文字セットでエンコードされた char ベースのシングルまたはダブルバイトの文字および文字列です。

Note

Microsoft では、すべての新しい開発に MFC Unicode ライブラリを使用することをお勧めします。
MB (メガバイト)CS ライブラリは、Visual Studio 2013 および Visual Studio 2015 で非推奨となりました。 この点は変更されました。
Visual Studio 2017 以降、MB (メガバイト)CS ライブラリは非推奨になり、非推奨の警告は生成されません。

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 には、CStringLPCTSTR を相互に変換するための 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 の代わりに TCHARchar* または wchar_t* の代わりに LPTSTRconst char* または const wchar_t* の代わりに LPCTSTR を使用しています。 これによって、MBCS または Unicode への正しいマッピングが確保されます。

関連項目

文字列 (ATL/MFC)
文字列操作