2012-11-08 11 views
10

可能性の重複:
Why does string.Compare seem to handle accented characters inconsistently?文字列部分の比較

私は部未満であるどのようにそれが最初の文字列の一部とすることができる次のコード

var s1 = "ABzzzzz2"; 
var s2 = "äbzzzzz1"; 

var cmp = StringComparison.InvariantCultureIgnoreCase; 

Console.WriteLine(string.Compare(s1, 0, s2, 0, 7, cmp)); //prints -1 
Console.WriteLine(string.Compare(s1, 0, s2, 0, 8, cmp)); //prints 1 

を持っています最初の文字列全体が2番目の文字列全体よりも大きいのに対し、
私はx64、.net 2.0,3.5,4.0でテストしました

+1

最後に番号が順序を定義することが優先されるようです。 –

+1

@Jan '2'を' b'、 '1'を' a'で置き換えた場合と同じ結果になります。 – Rawling

+2

サンプルを簡略化することができます: 'var s1 =" a2 "; var s2 = "ä1"; Btw、Umlautは重要です。 –

答えて

1

私の理論は、まずアルゴリズムを文字列を正規化してから比較します。この "äbzzzzz1"によると、 "abzzzzz1"として正規化されています。正規化された形式の最初の比較では等値が返されますが、実際の文字列が等しくないため0を返すことはありません。したがって、それは順序の比較と結果-1に戻ります。第2のケースで

は、正規化した後、「abzzzzz2」が「abzzzzz1」よりも大きいことは明らかである結果が1

であるように、このアプローチはまた、正規化の詳細についてはthis question で述べた場合はMSDN page

をチェック説明