簡體   English   中英

Unicode toUppercase與OrdinalIgnoreCase / InvariantCultureIgnoreCase

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM