Unicode プログラミングの要約

Unicode に対する MFC や C のランタイム機能のサポートを有効にするには、次のようにします。

  • _UNICODE を定義します。

    シンボル _UNICODE を定義してプログラムをビルドします。

  • エントリ ポイントを指定する。

    プロジェクトの [プロパティ ページ] ダイアログ ボックスで、[リンカー] フォルダーの [詳細] ページにある [エントリ ポイント]wWinMainCRTStartup に設定します。

  • 移植性の高いランタイム関数と型を使用する。

    Unicode 文字列を取り扱う際は、必ず適切な C ランタイム関数を使います。 wcs 系関数も使用できますが、完全に移植性の高い (国際対応の) _TCHAR マクロを使用することをお勧めします。 これらのマクロにはすべて接頭字 _tcs が付けられ、str ファミリの関数と一対一で対応します。 これらの関数については、「ランタイム ライブラリ リファレンス」の「国際化」で詳しく説明されています。 詳細については、「tchar.h における汎用テキストのマッピング」を参照してください。

    _TCHAR と、この章の「Unicode のサポート」で説明している移植性のあるデータ型を使います。

  • リテラル文字列を正しく処理する。

    Visual C++ コンパイラでは、次のリテラル文字列を

    L"this is a literal string"
    

    Unicode 文字の文字列として解釈します。 リテラル文字にも、同じプリフィックスを使うことができます。 _T マクロを使ってリテラル文字列を包括的にコーディングすると、Unicode 環境下の Unicode 文字列として、または Unicode を含めない ANSI 文字列 (MBCS を含む) としてコンパイルされます。 たとえば、次の表記の代わりに、

    pWnd->SetWindowText( "Hello" );
    

    を使う代わりに、

    pWnd->SetWindowText( _T("Hello") );
    

    を使うようにします。_UNICODE が定義されていると、_T はリテラル文字列を L プレフィックスが付いた形式に変換します。そうでない場合には、_T は L プレフィックスを付けずに文字列を変換します。

    ヒント

    _T マクロは、_TEXT マクロと同じです。

  • 注意して文字列の長さを関数に渡す。

    文字列の文字数を要求する関数もありますが、バイト数を要求する関数もあります。 たとえば、_UNICODE が定義されていると、CArchive オブジェクトへの次の呼び出しは正常に機能しません (strCString 型です)。

    archive.Write( str, str.GetLength( ) );    // invalid
    

    Unicode アプリケーションの場合、文字列の長さは文字数を表しますが、各文字が 2 バイト幅なので、正確なバイト数ではありません。 バイト数を渡す場合は、次のコードを記述する必要があります。

    archive.Write( str, str.GetLength( ) * sizeof( _TCHAR ) );    // valid
    

    このコードにより、正確なバイト数を書き込むことができます。

    これに対して、バイト指向ではなく文字指向の MFC メンバー関数の場合は、この補足コードがなくても正常に機能します。

    pDC->TextOut( str, str.GetLength( ) );
    

    CDC::TextOut は、バイト数ではなく文字数を取ります。

  • Unicode ファイルを開くには、fopen_s、_wfopen_s を使用します。

MFC とランタイム ライブラリによる Unicode プログラミングのサポートをまとめると、次のようになります。

  • データベース クラスのメンバー関数を除いて、CString を含むすべての MFC 関数は、Unicode に対応しています。 また、CString には、Unicode/ANSI 変換関数も用意されています。

  • ランタイム ライブラリには、すべての文字列操作関数の Unicode バージョンが用意されています。 (ランタイム ライブラリには、Unicode または MB (メガバイト)CS に適したポータブル バージョンも用意されています。これらはマクロです_tcs)。

  • tchar.h には、リテラル文字列と文字を変換するための移植性のあるデータ型と _T マクロが用意されています。 詳細については、「tchar.h における汎用テキストのマッピング」を参照してください。

  • ランタイム ライブラリには、main のワイド文字バージョンが用意されています。 wmain を使用して、アプリケーションが Unicode を認識できるようにします。

関連項目

Unicode のサポート