CompareString

https://msdn.microsoft.com/ja-jp/library/ms776310.aspx https://msdn.microsoft.com/ja-jp/library/ms776264.aspx https://msdn.microsoft.com/ja-jp/library/cc428944.aspx https://msdn.microsoft.com/ja-jp/library/ms776290.aspx https://msdn.microsoft.com/ja-jp/library/ms776315.aspx https://msdn.microsoft.com/ja-jp/library/ms776244.aspx https://msdn.microsoft.com/ja-jp/library/ms776290.aspx https://msdn.microsoft.com/ja-jp/library/ms776310.aspx

指定されたロケールを使って、2 つの文字列を比較します。

int CompareString(
  LCID Locale,       // ロケール識別子
  DWORD dwCmpFlags,  // 比較方法のオプション
  LPCTSTR lpString1, // 最初の文字列
  int cchCount1,     // 最初の文字列のサイズ
  LPCTSTR lpString2, // 2 番目の文字列
  int cchCount2      // 2 番目の文字列のサイズ
);

パラメータ

Locale
比較に使うべきロケールを指定します。あらかじめ定義されている次のロケール識別子のいずれかを指定します。
意味
LOCALE_SYSTEM_DEFAULTシステムの既定のロケール
LOCALE_USER_DEFAULT現在のユーザーの既定のロケール

マクロを使って作成したロケール識別子を指定することもできます。ロケール識別子の詳細については、MSDN ライブラリの「」を参照してください。

dwCmpFlags
この関数が 2 つの文字列を比較する方法を表すオプションを指定します。既定では、どのフラグも指定されていません。0、または、次の値の組み合わせを指定します。
意味
NORM_IGNORECASE欧文の大文字と小文字を区別しません。
NORM_IGNOREKANATYPE日本語のひらがなとカタカナを区別しません。対応関係にあるひらがなとカタカナ(たとえば、「あ」と「ア」)を等しいものと見なします。
NORM_IGNORENONSPACE場所を取らない文字を区別しません。濁音記号や半濁音記号の有無(は、ば、ぱ)や、アクセント記号の有無(e と驕j、ウムラウトの有無(o とjがこれに該当します。
NORM_IGNORESYMBOLS記号を無視します。英文などのアポストロフィ(')がこれに該当します。
NORM_IGNOREWIDTH1 バイト文字と、それに対応する 2 バイト文字を区別しません。たとえば、半角の「1」と全角の「1」が同じ文字として扱われます。
SORT_STRINGSORT句読点を記号として扱います。詳細については、この関数の「解説」の表を参照してください。

lpString1
比較に使われる、最初の文字列へのポインタを指定します。
cchCount1
lpString1 パラメータが指す文字列の文字数を TCHAR 単位で指定します。この長さには、終端の NULL を含めないでください。-1 を指定すると、文字列は NULL で終わっているものと見なされ、長さが自動的に計算されます。
lpString2
比較に使われる、2 番目の文字列へのポインタを指定します。
cchCount2
lpString2 パラメータが指す文字列の文字数を TCHAR 単位で指定します。この長さには、終端の NULL を含めないでください。-1 を指定すると、文字列は NULL で終わっているものと見なされ、長さが自動的に計算されます。

戻り値

関数が成功すると、次の値のいずれかが返ります。

意味
CSTR_LESS_THANlpString1 が指す文字列は、lpString2 が指す文字列よりも辞書順で前にあります。
CSTR_EQUALlpString1 が指す文字列は、lpString2 が指す文字列と辞書順で同じ位置にあります。
CSTR_GREATER_THANlpString1 が指す文字列は、lpString2 が指す文字列よりも辞書順で後にあります。

関数が失敗すると、0 が返ります。拡張エラー情報を取得するには、 関数を使います。GetLastError は、次のエラーコードのいずれかを返すことがあります。

ERROR_INVALID_FLAGS
ERROR_INVALID_PARAMETER

解説

2 つの文字列が同一でなくても、照合上等しいと見なされた場合、CSTR_EQUAL が返ります。

C のランタイムライブラリが文字列を比較する際に適用する規則との整合性を保つには、この関数が 0 以外の値を返したときに、その戻り値から 2 を引いてください。<0==0> 0 の意味は、C のランタイムライブラリと等しくなります。Winnls.h ファイル内で、CSTR_LESS_THAN は 1、CSTR_EQUAL は 2、CSTR_GREATER_THAN は 3 と定義されているので、それぞれから 2 を引くと、-1、0、1 になります。

2 つの文字列の長さが異なる場合は、短い方の文字列の長さだけを対象として、比較を行います。この長さによる比較の結果が等しかった場合、長い方の文字列が大きいと判断されます。

通常、この関数は「単語ソート」という方法を使って文字列を比較します。単語ソートでは、ハイフン(-)とアポストロフィ(')を除き、他のすべての句読点や英数字以外のその他の記号が、英数字より前の順序で扱われます(たとえば、A より @ が先の順序で扱われます)。ただし、ハイフンとアポストロフィは特別の扱いを受けます。その結果、並べ替え後のリストで、coop と co-op は隣接する位置にあるものとして扱われます。

SORT_STRINGSORT フラグを指定した場合、「文字列ソート」という方法を使って文字列を比較します。文字列ソートでは、ハイフンとアポストロフィも、英数字以外の他の記号と同様に扱われ、英数字より前の順序で扱われます。

次の表は、単語ソートと文字列ソートの実行例を示します。

単語ソート文字列ソート     単語ソート文字列ソート
billetbill's t-antt-ant
billsbillet tanyat-aria
bill'sbills t-ariatanya
cannotcan't suedsue's
cantcannot suessued
can'tcant sue'ssues
conco-op wentwe're
coopcon werewent
co-opcoop we'rewere

lstrcmp 関数と lstrcmpi 関数は、単語ソートを使います。CompareString 関数と 関数は、既定で単語ソートを使いますが、SORT_STRINGSORT フラグが指定されている場合、文字列ソートを使います。

CompareString 関数は、パラメータで 0 または NORM_IGNORECASE を指定し、cchCount1 cchCount2 の各パラメータで -1 を指定したときに最高の速度を達成するよう、最適化されています。

CompareString 関数は、比較を行う際にアラビア語の Kashida(カシダ)を無視します。(カシダとは引き伸ばし記号のことです。アラビア語では文字と文字を隣接させて表記するか、文字と文字の間に引き伸ばし記号、つまり下線を入れるか選択することができます。)カシダの存在を無視すると 2 つの文字列が等しくなる場合、この関数は CSTR_EQUAL(2)を返します。つまり、それらの文字列は照合上等しいものと見なされますが、必ずしも等しいとは限りません。

DBCS(ダブルバイト文字セット)ロケールでは、NORM_IGNORECASE フラグを指定すると、すべてのワイド(2 バイト)文字とナロー(1 バイト)文字の両方に影響を及ぼします。ギリシャ文字とキリル文字の各ワイド文字もこれに該当します。

中国語簡体字では、文字の比較に使う並べ替えの順序は、記号、数字、英字、中国語簡体字の順です。各グループ内の文字どうしは、文字コードの順に並べ替えられます。

中国語繁体字では、文字の比較に使う並べ替えの順序は、文字の画数に基づいています。記号、数字、英字は 0 画の文字として扱われます。そして、記号、数字、英字、中国語繁体字の順で並べ替えが行われます。各画数内の文字どうしは、文字コードの順に並べ替えられます。

日本語では、文字の比較に使う並べ替えの順序は、日本語の 50 音順に基づいています。表意文字である漢字は、文字コードの順に並べ替えられます。

日本語では、NORM-IGNORENONSPACE フラグを指定すると、濁音、半濁音、長音、拗音、促音に影響を及ぼし、さらにかなと漢字の切り替え文字(JIS 漢字のシフト記号)にも影響を及ぼします。

ハングル(韓国語)では、文字の比較に使う並べ替えの順序は、記号、数字、Jaso(ジャソ;子音グループ)と Hangeul(ハングル;Jaso に母音を含めた文字)、Hanja(ハンジャ;韓国の漢字)、英字の順です。Jaso と Hanguel のグループでは、各 Jaso の後に、その Jaso で始まる複数の Hanguel が続きます。Hanja は、Hanguel による読みの順に並べ替えられます。複数の Hanja の読みが等しい場合、それらの Hanja は文字コードの順に並べ替えられます。

NORM_IGNORENONSPACE フラグが影響を及ぼすのは、2 段階で文字列の並べ替えを行うロケール、つまり最初はアクセントなしの文字列で並べ替えを行い、その後にアクセントを考慮して並べ替えを行う 2 パスのロケールにのみ影響を及ぼします。このようなロケールでは、最初のパスで文字列の中のすべての文字のアクセント記号を無視して並べ替えを行います。そして、これらの文字が等しい場合、文字列全体に対して 2 番目のパスを実行します。このフラグは、2 番目のパスを実行しないよう指示します。一方、最初のパスでアクセント付きの文字の並べ替えを行うロケール(アクセントを考慮する)では、このフラグは何も影響を及ぼしません。

対応情報

Windows NT/2000:Windows NT 3.1 以降
Windows 95/98:Windows 95 以降
ヘッダー:Winnls.h 内で宣言、Windows.h をインクルード
インポートライブラリ:Kernel32.lib を使用
Unicode:Windows NT/2000 は Unicode 版と ANSI 版を実装

参照

FoldString, , , , lstrcmp, lstrcmpi,

表示: