次の方法で共有


文字列関数の相違点

このトピックでは、Unicode および文字セット情報の処理で使用される文字列関数の違いについて説明します。 これらの関数には、 UnicodeWindows の両方のコード ページ の実装があり、Unicode と Windows のコード ページ パラメーターをサポートします。

次の文字列関数では、特別なコメントは必要ありません。 Unicode と Windows のコード ページの実装は同じように機能します。

文字列長関数の 1 つによって取得される長さの値は、常に通常の文字幅 (Windows コード ページの場合は 8 ビット、Unicode の場合は 16 ビット) に基づいています。 この値は、多くの場合、"文字数" と呼ばれます。この用語は厳密に正しいのは、 2 バイト文字セット (DBCS) を使用する Windows コード ページには、実際には 2 つの連続したバイトで表される全角文字があるためです。 Unicode の サロゲート でも同様の状況が発生します。

次の文字列関数は、ユーザーがコントロール パネルで選択した言語から派生した、現在のスレッドのロケールに依存します。 lstrcmp 関数と lstrcmpi 関数は、ANSI の名前を含むバイト比較 (strcmp など) を実行しません。 代わりに、ロケールの規則に従って文字列を比較します。

次の関数は、使用されているバージョンに応じて、OEM 文字セットと現在の Windows コード ページまたは Unicode の間で変換します。

印刷関数 ( StringCbPrintf など) は、書式指定で次の新しいデータ型と変更されたデータ型を提供することで Unicode をサポートします。 これらの書式指定は、関数が対応する入力パラメーターを解釈する方法に影響します。

書式の指定 Windows コード ページ バージョンのデータ型 Unicode バージョンのデータ型
c CHAR WCHAR
C WCHAR CHAR
hc、hC CHAR CHAR
hs、hS LPSTR LPSTR
lc、lC WCHAR WCHAR
ls、lS LPWSTR LPWSTR
s LPSTR LPWSTR
S LPWSTR LPSTR

 

出力テキストのデータ型は、常に関数のバージョンによって異なります。 入力パラメーターのデータ型と出力テキストのデータ型が一致しない場合、印刷関数は必要に応じて Unicode から現在の Windows コード ページに変換するか、またはその逆を実行します。

Unicode バージョンの印刷関数の場合、書式指定文字列は Unicode で、出力テキストも同様です。

注意事項

バッファー処理の不十分さは、バッファー オーバーランを伴う多くのセキュリティの問題に関係しています。 「Strsafe.h リファレンス」を参照してください。 Strsafe.h で定義されている関数は、コード内で適切なバッファー処理を行うための追加処理を提供します。 このため、組み込みの C/C++ に対応する実装と、特定の Microsoft Windows 実装を置き換えることを目的としています。 詳細については、「 セキュリティに関する考慮事項: 国際機能」を参照してください。

 

Windows API の Unicode