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

更新 : 2007 年 11 月

国際化対応にするには巨大な文字セット (日本語、中国語などの文字セット) を扱う必要があります。これらの言語に対応するために MFC では巨大な文字セットを処理する 2 つの機能が用意されています。

  • Unicode

  • マルチバイト文字セット (MBCS)

MFC がサポートする Unicode 文字列

MFC 全般で、条件を指定することで Unicode 文字および文字列が利用できます。CString クラスでは Unicode がサポートされています。

ey142t48.alert_note(ja-jp,VS.90).gifメモ :

Unicode バージョンの MFC ライブラリは、カスタム インストール時に指定しない限り、ハード ディスクにコピーされません。これ以外のインストールではコピーされません。MFC Unicode ファイルを使用せずに MFC Unicode アプリケーションをビルドまたは実行しようとすると、エラーが発生する場合があります。

ハード ディスクにファイルをコピーするには、セットアップを再実行し、[機能の追加と削除] をクリックします。[言語ツール]、[Visual C++]、[Visual C++ クラスおよびテンプレート ライブラリ] をクリックし、[ATL MFC 共有ライブラリ Unicode] と [ATL MFC スタティック ライブラリ 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 を表します。

CStringTCHAR 型によって構成されます。プログラムをビルドするときにシンボル _UNICODE を定義すると、TCHAR は wchar_t 型 (16 ビット コード) として定義されます。_UNICODE を定義しないと、char 型 (8 ビット コード) として定義されます。したがって、Unicode を使用するときは、CString オブジェクトを 16 ビット幅の文字で構成します。Unicode を使用しないときは、char 型文字で構成します。

アプリケーションを Unicode 対応にするには、次のことも行う必要があります。

  • 条件によってリテラル文字列を Unicode に切り替えるときは _T マクロを使用します。

  • 文字列を引数として渡すときは、その関数が文字列の長さを文字数とバイト数のどちらで数えるのかを注意してください。Unicode を使用するときは、文字数とバイト数の長さが異なります。

  • C ランタイム ライブラリの文字列操作関数は Unicode 対応バージョンを使用してください。

  • 文字および文字へのポインタには、以下の型を使用してください。

    • TCHAR   通常は char 型にするデータ。

    • LPTSTR   通常は char* 型にするデータ。

    • LPCTSTR   通常は const char* 型にするデータ。CStringoperator LPCTSTR によって CStringLPCTSTR の間の型変換が行われます。

CString のコンストラクタ、代入演算子、比較演算子は Unicode を適切に処理します。

Unicode プログラミングの関連情報については、「Unicode と MBCS」と「Unicode」を参照してください。「ランタイム ライブラリ リファレンス」では、文字列処理関数のすべてについて移植性が高いバージョンを定義しています。「国際化」を参照してください。

MFC がサポートする MBCS 文字列

MFC ではマルチバイト文字セット (MBCS) もサポートしています。サポートされているのは、2 バイト文字セット (DBCS: Double-Byte Character Sets) です。

DBCS では、1 文字は 1 バイトまたは 2 バイト幅です。2 バイト幅の文字では 1 バイト目が "先行バイト" になり、特定の範囲の文字を含むコード ページを指定します。先行バイトと 2 バイト目の "後続バイト" を組み合わせると、そのコードが表す文字が決まります。

プログラムをビルドするときに _MBCS シンボルを定義すると、TCHAR 型 (CString はこの型に基づいて構成されています) は char 型に変換されます。_MBCS シンボルを定義したときは、CString 中のどのバイトが先行バイトであり、どのバイトが後続バイトであるかはプログラマが判定してください。この判定用の関数は C ランタイム ライブラリで定義されています。

DBCS では、文字列の中に任意の ANSI の 1 バイト文字と 2 バイト文字を混在させることができます。したがって、DBCS では CString オブジェクトなどの文字列の解析時に特別な注意が必要です。

ey142t48.alert_note(ja-jp,VS.90).gifメモ :

MFC における Unicode 文字列のシリアル化は、Unicode 文字列と MBCS 文字列の両方について、どちらのバージョンのアプリケーションを使用しているのかを考慮せずに読み込むことができます。したがって、データ ファイルはアプリケーションの Unicode 版と MBCS 版の間で移植性があります。

CString のメンバ関数は、特別な "汎用テキスト" バージョンの C ランタイム ライブラリ関数を使用します。つまり、 Unicode 対応の関数を使用します。たとえば、CString のメンバ関数が通常 strcmp を呼び出す場所では、代わりに "汎用テキスト" 関数 _tcscmp を呼び出します。シンボル _MBCS および _UNICODE が定義されているかどうかに応じて、_tcscmp は以下の関数呼び出しに変換されます。

_MBCS が定義されている場合

_mbscmp

_UNICODE が定義されている場合

wcscmp

どちらのシンボルも定義されていない場合

strcmp

ey142t48.alert_note(ja-jp,VS.90).gifメモ :

シンボル _MBCS_UNICODE は相互に排他的です。

汎用テキスト関数が適切なバージョンに変換されるしくみについては、「ランタイム ライブラリ リファレンス」を参照してください。「国際化」を参照してください。

CString のメンバ関数の内部でも同様のバージョン変換が行われます。MBCS と Unicode 対応を維持するために、MFC では char の代わりに TCHARchar* の代わりに LPTSTRconst char* の代わりに LPCTSTR を使用しています。これによって、該当するバージョンに正しく変換されます。

参照

その他の技術情報

文字列 (ATL/MFC)