FC2ブログ

文字列比較で今更な話

同じ課の後輩から、久しぶりに質問が来た。

後輩:ちょっと良いっすか?
俺:いつでも良いよ。今駄目ならいつも駄目だし。

当時は手がけていた仕事が行き詰っていて、常に忙しかったので、逆にいつでも外からの質問を受け付ける方針にしていた。どんな仕事でも、気分転換は必要である。

後輩:文字列の比較でなんか変なことになってるっす。
俺:今更文字列の比較で変になってるっすか。
後輩:今更、と言われても、変なものは変なんすよ

どうも、彼は欧州向けのシステム開発に従事していて、とあるデータ連携バッチで問題になっているそうで。
欧州では、「ä(ウムラウトa)」や「ß(エスツェット)」のような独特の文字があり、扱えない時はアルファベットで代替する。
例えば、ミュンヘンは、ドイツ語で「München」で、「ü」を扱えないときは、「Muenchen」で代替表記する。

後輩:で、stringのCompareToメソッドで比較するとですね、「ß」と「ss」が同じ文字列扱いされるんっすよ。
俺:え。マジで?
後輩:ええ、マジで。だから困っているし、こうして相談してるんじゃないっすか。

調べてみると、実際そうだった。
var text1 = "Masse";
var text2 = "Maße";
var equal1 = text1 == text2; //false
var equal2 = string.Equals(text1, text2);//false
var compare1 = text1.CompareTo(text2);//0 (!!)

俺:ほんとだ。
後輩:でしょ?
俺:なんて、おおきなお世話なんだ。
後輩:ですよねぇ(苦笑)。

まあ、仕様を理解せずに使っているが為の文句を言ってもしょうがないので、.NET の文字列を使用するためのベスト プラクティスで調べてみた。それによれば、「現在カルチャの規則に依存したくないなら、StringComparisonのOrdinalを使え」と書いてある。
ということは、Compareメソッドのオプションをそうするか、CompareOrdinalメソッドを使えば良いということか。
var compare2 = string.Compare(text1, text2); //0
var compare3 = string.Compare(text1, text2, StringComparison.Ordinal);//0以外
var compare4 = string.CompareOrdinal(text1, text2);//0以外
ソートするときは、CmpareToメソッド、比較するときは、CompareOrdinalメソッドか。使い分けめんどくさいぞ。
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: C# | コメント: 0 | トラックバック: 0

サイドバー背後固定表示サンプル

当ブログに書かれたソースコードは流用自由です。

バグ、スペルミス等はありうる事です。

ご利用の際は自己責任でお願いしますm(_ _)m