ジェネリック データ型の使用

コードでジェネリック データ型を使用する場合は、プリプロセッサ ディレクティブを使用してヘッダー ファイルの#include ステートメントの前に "UNICODE" を定義するだけで、Unicode 用にコンパイルできます。 Windows (ANSI) コード ページのコードをコンパイルするには、"UNICODE" 定義を省略します。 新しい Windows アプリケーションでは、Unicode を使用して、さまざまなコード ページの不整合を回避し、ローカライズを簡略化する必要があります。

Unicode 文字と文字列を使用するか、Windows コード ページの文字と文字列を使用するためにコンパイルできるソース コードを作成するには、

  1. テキストに使用されるすべての文字型と文字列型には、TCHAR、LPTSTR、LPTCH などのジェネリック データ型を使用します。 ジェネリック型の詳細については、「 文字列の Windows データ型」を参照してください。

  2. テキスト以外のデータ バッファーまたはバイナリ バイト配列へのポインターは、LPTSTR 型や LPTCH 型ではなく、LPBYTE や LPWORD などのデータ型でコーディングしてください。

  3. 必要に応じて LPVOID を使用して、不確定型のポインターを void ポインターとして明示的に宣言します。

  4. ポインターの算術型を非依存にします。 TCHAR サイズの単位を使用すると、UNICODE が定義されている場合は 2 バイト、UNICODE が定義されていない場合は 1 バイトの変数が生成されます。 ポインター算術演算を使用すると、要素のサイズが 1 バイトか 2 バイトかに関係なく、ポインターによって示される要素の数が常に返されます。 次の式は、UNICODE が定義されているかどうかに関係なく、常に要素の数を取得します。

    cCount = lpEnd - lpStart;
    

    次の式は、使用されるバイト数を決定します。

    cByteCount = (lpEnd - lpStart) * sizeof(TCHAR);
    

    ポインターのインクリメントは次の文字要素を指しているため、次のようなステートメントを変更する必要はありません。

    chNext = *++lpText;
    
  5. リテラル文字列とマニフェスト文字定数をマクロに置き換えます。 次のような式を変更します。

    while(*lpFileName++ != '\\')
    {
        // ...
    }
    

    この式では、次のように TEXT マクロを使用します。

    while(*lpFileName++ != TEXT('\\'))
    {
        // ...
    }
    

    TEXT マクロを使用すると、UNICODE が定義されている場合は文字列が L"string" として評価され、それ以外の場合は "string" として評価されます。 管理を容易にするために、リテラル文字列をリソースに移動します。特に、ASCII 範囲外の文字 (0x00から0x7F) が含まれている場合や、ユーザー インターフェイスで公開されている場合は特にです。 さまざまな各国語のアプリケーションのローカライズをサポートするには、すべてのユーザー インターフェイス文字列がローカライズ可能なリソースに含まれていることが非常に重要です。

  6. Windows 関数の汎用バージョンを使用します。 詳細については、「 関数プロトタイプの規則」を参照してください。

  7. 標準 C ライブラリ文字列関数のジェネリック バージョンを使用し、「 標準 C 関数」で説明されているように、"_UNICODE" と "UNICODE" を必ず定義してください。

  8. 最初に Windows コード ページ用に記述されたアプリケーションを適応させる場合は、文字の最大値として 255 に依存するすべてのコードを変更することを忘れないでください。

上記で説明したように記述したコードをコンパイルすると、コンパイラは同じソースから Unicode と Windows の両方のコード ページ バージョンのアプリケーションを作成できます。 UNICODE の定義に応じて、ジェネリック関数は、Unicode 専用または Windows コード ページ専用のコードを記述した場合と同じバイナリ ファイルを生成するように解決されます。

Unicode と文字セットの使用