Unicode に相当するものがない関数の使用

Unicode バージョンで実装されていない関数は、通常、 Unicode をサポートするより強力な関数または拡張関数に置き換えられました。 たとえば、 OpenFile 関数を呼び出すコードを移植する場合、アプリケーションは代わりに CreateFile 関数を使用して Unicode をサポートできます。

関数に Unicode に相当するものがない場合、アプリケーションは関数呼び出しの前後に 8 ビット文字セットとの間で文字をマップできます。 たとえば、数値書式関数 atoiitoa では、0 ~ 9 の数字のみを使用します。 通常、Unicode を 8 ビット文字にマッピングするとデータが失われますが、コードを型に依存せず、式を条件付きにすることで回避できます。 次の例のステートメントは、8 ビット文字用に記述されており、型に依存するため、Unicode をサポートするように変更する必要があります。

char str[4] = "137";

int num = atoi(str);

これらのステートメントは、型に依存しないために、次のように書き換えることができます。

TCHAR tstr[4] = TEXT("137");

#ifdef UNICODE
size_t cCharsConverted;
CHAR strTmp[SIZE]; // SIZE equals (2*(sizeof(tstr)+1)). This ensures enough
                   // room for the multibyte characters if they are two 
                   // bytes long and a terminating null character. See Security 
                   // Alert below. 

wcstombs_s(&cCharsConverted, strTmp, sizeof(strTmp), (const wchar_t *)tstr, sizeof(strTmp));
num = atoi(strTmp);

#else

int num = atoi(tstr);

#endif 

この例では、標準の C ライブラリ関数 wcstombs は Unicode を ASCII に変換します。 この例では、周囲のテキストの一部が変換できない場合でも、数字 0 から 9 は常に Unicode から ASCII に変換できるという事実に依存しています。 atoi 関数は、数字ではない任意の文字で停止します。

アプリケーションでは、各国語サポート (NLS) LCMapString 関数を使用して、Unicode の一部のスクリプトに指定された ネイティブ数字 を含むテキストを処理できます。

注意事項

wcstombs 関数を誤って使用すると、アプリケーションのセキュリティが損なわれる可能性があります。 8 ビット文字の文字列のアプリケーション バッファーが 2*(char_length +1) 以上であることを確認します。 ここで、char_length は Unicode 文字列の長さを表します。 この制限は、 2 バイト文字セット (DBCS) を使用すると、各 Unicode 文字を 2 つの連続する 8 ビット文字にマップできるためです。 バッファーが文字列全体を保持していない場合、結果の文字列は null で終わらないので、セキュリティ上のリスクが生じます。 アプリケーションのセキュリティの詳細については、「 セキュリティに関する考慮事項: 国際機能」を参照してください。

 

Unicode と文字セットの使用