C ランタイム関数での文字列比較順序に関して
こんにちは、Visual Studio サポートチームです。
今回は、以下の C ランタイム関数の文字列順序の比較規則について概要をご説明します。
strcoll、wcscoll、_mbscoll、_strcoll_l、_wcscoll_l、_mbscoll_l
上記関数の動作としては、「現在のロケールまたは指定された LC_COLLATE 変換状態カテゴリを使用して、文字列を比較」します。
弊社の不備にて、現在、日本語ドキュメントでは誤ったご案内となっておりますが、上記内容が正しい説明であり、英語版の最新ドキュメントでは正しいご説明をしています。
https://msdn.microsoft.com/en-us/library/a7cwbx4t(v=vs.120).aspx
この比較動作について詳細は以下となります。
概要
==========
Setlocale 関数で LC_COLLATE を指定した状態で wcscoll 関数を実行すると、最終的には Win32 API の関数である CompareString 関数が SORT_STRINGSORT フラグ指定で呼び出されます。
同関数では、"辞書順での比較" が行われます。
一方、Setlocale を実施しない場合、もしくは関数の比較動作に影響しない LC_CTYPE を指定した場合には、CompareString 関数は使用されず、UNICODE の体系に沿った "バイナリ値での並び順" により文字列を比較します。
例
==========
具体例として、ロケールに何も設定しない場合
(バイナリ比較)、および、LC_COLLATE で "Japanese_Japan.932" ないし
"English_United States.12512" を指定した場合 (辞書順比較) の、アルファベット (大文字 / 小文字)、ひらがな、カタカナ、数字、記号等の比較結果を参考として以下にご案内します。
傾向を判断するために代表的な結果のみご案内しますが、詳細な比較順序、結果をご確認いただく場合は実際にアプリケーションでの実行結果をご確認ください。
※指定により結果が変化する場合を色づけしております。
設定無し (UNICODE バイナリ比較) |
Japanese_Japan.932 (日本語辞書順) |
English_UnitedStates.12512 (英語辞書順) |
A < a |
A > a |
A > a |
B < a |
B > a |
B > a |
あ < ア |
あ > ア |
|
い < ア |
い > ア |
|
ぁ < あ |
ぁ < あ |
|
か < が |
か < が |
|
ア < ア |
ア > ア |
|
a < a |
a < a |
|
* < 0 |
* < 0 |
* < 0 |
* < a |
* < a |
* < a |
0 < a |
0 < a |
0 < a |