![](/img/trans.png)
[英]Why does OrdinalIgnoreCase and InvariantCultureIgnoreCase return different results?
[英]Unicode toUppercase vs OrdinalIgnoreCase / InvariantCultureIgnoreCase
根據Unicode,字符U + 0131 拉丁文小寫字母I大寫為ASCII字符'I',字符U + 017F''拉丁文小寫字母LONG S為大寫的ASCII字符'S'
以下代碼在兩次檢查中均失敗
string check = "\u0131\u017F";
if ( string.Equals( check, "IS",StringComparison.OrdinalIgnoreCase ) ) {
Console.WriteLine( "Ok!" );
}
if ( string.Equals( check, "IS", StringComparison.InvariantCultureIgnoreCase ) ) {
Console.WriteLine( "Ok!" );
}
假設UnicodeData.txt中定義的Unicode toUppercase映射不是語言上的,而是不變的,那么OrdinalIgnoreCase和InvariantCultureIgnoreCase遵循的規則到底是什么?
我還沒有找到任何穩定的邏輯來解釋OrdinalIgnoreCase的行為,因此我決定使用蠻力並編寫自定義的Mapper類,該類可以處理比較和獲取char *段的哈希碼。
這樣做的原因是為了支持OrdinalIgnoreCase比較和對最近引入的ReadOnlySpan的相等性檢查,也許以后可以實現一個字符串字典,該字典可以接受來自字符串和ReadOnlySpan的查找
在此處提交了非常早期的Mapper版本OrdinalIgnoreCase.Map.cs
而且,在通過“比較和相等”測試時,由於Unicode塊Deseret上的某些不一致行為,GetHashCode失敗。 似乎OrdinalIgnoreCase的GetHashCode算法將Deseret的小寫字母轉換為大寫字母,而Equals和Compare則不然。 您可以在Deseret.cs的代碼中觀察到該行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.