マルチバイト文字セット (MBCS) のサポート
マルチバイト文字セット (MBCS: Multibyte Character Set) は、日本語や中国語など、1 バイト文字では表現できない文字セットをサポートするニーズに対する古いアプローチです。 新規開発を行う場合は、エンド ユーザーに対して表示されることのないシステム文字列を除き、すべてのテキスト文字列で Unicode 文字列を使用する必要があります。 MBCS は、レガシ テクノロジであり、新規開発にはお勧めしません。
最も一般的な MBCS の実装は、2 バイト文字セット (DBCS: Double-Byte Character Set) です。 Visual C++ と MFC では、DBCS に完全に対応しています。
サンプルについては、MFC ソース コード ファイルを参照してください。
大きな文字セットを採用している市場に対応したプラットフォームでは、Unicode の代わりとしては MBCS がまず考えられます。 MFC では、国際化に対応できるデータ型と C ランタイム関数を使用することにより MBCS をサポートしています。 プログラム コードでもこれらを使用するようにしてください。
MBCS では、1 バイトまたは 2 バイトのいずれかで文字がエンコードされます。 2 バイト文字では、最初にくる先頭バイトとその後ろに続くバイトの両方で 1 つの文字と解釈されるようになっています。 この最初のバイトは、先行バイト用に予約されている範囲の値をとります。 バイトのどの範囲が先行バイトとなるかは、使用するコード ページによって異なります。 たとえば、日本語のコード ページ 932 では 0x81 から 0x9F までの範囲を先行バイトとして使いますが、韓国語のコード ページ 949 では別の範囲を使っています。
MBCS のプログラミングでは、次の点について考慮する必要があります。
環境内の MBCS 文字 MBCS 文字は、ファイルやディレクトリの名前などの文字列に使用されている可能性があります。
編集操作
MBCS アプリケーションでの編集操作は、バイトではなく文字に対して行う必要があります。 カレットで文字を分割しないでください。右方向キーでは、右へ 1 文字移動し、その他同様にします。 削除は 1 文字を削除し、元に戻すは 1 文字を挿入し直すようにする必要があります。
文字列の処理
MBCS を使うアプリケーションでは、文字列操作で特殊な問題が出てきます。 1 つの文字列の中に 1 バイト幅の文字と 2 バイト幅の文字が混在しているため、先頭バイトがあるかどうかを必ず確認する必要があります。
ランタイム ライブラリのサポート
C のランタイム ライブラリおよび MFC は、1 バイト文字、MBCS、および Unicode でのプログラミングをそれぞれサポートしています。 1 バイトの文字列は、str
ファミリのランタイム関数で処理され、MBCS 文字列は、対応する _mbs
関数で処理され、Unicode 文字列は、対応する wcs
関数で処理されます。 MFC クラスのメンバー関数では、状況に応じて、通常の str
ファミリの関数、MBCS の関数、または Unicode の関数に割り当てる移植性の高いランタイム関数を使用しています。
MBCS と Unicode の移植性
tchar.h ヘッダー ファイルを使用すると、1 バイト、MBCS、および Unicode の各アプリケーションを同じソースからビルドできます。 Tchar.h は、 _tcsでプレフィックスが付いたマクロを定義します。マクロは、必要に応じて、 str
、 _mbs
、または wcs
関数にマップされます。 MBCS でビルドするには、シンボル _MBCS
を定義します。 Unicode をビルドするには、シンボル _UNICODE
を定義します。 MFC アプリケーションでは、既定で _UNICODE
が定義されています。 詳細については、「tchar.h における汎用テキストのマッピング」を参照してください。
Note
_UNICODE
と _MBCS
の両方を定義すると、動作が未定義になります。
Mbctype.h ヘッダー ファイルおよび Mbstring.h ヘッダー ファイルでは、MBCS 固有の関数とマクロが定義されています。この関数とマクロは状況に応じて必要になります。 たとえば _ismbblead
は、文字列の特定のバイトが先行バイトかどうかを示します。
多言語間での移植性を持たせるには、プログラムを Unicode またはマルチバイト文字セット (MBCS) でコーディングします。