全球化 API 在 Windows 10 上使用 ICU 程式庫
.NET 5 和更新版本在 Windows 10 2019 年 5 月更新或更新版本上執行時,使用 International Components for Unicode (ICU) 程式庫取得全球化功能。
變更描述
在 .NET Core 1.0 - 3.1 和 .NET Framework 4 及更新版本中,.NET 程式庫會對 Windows 上的全球化功能使用國家語言支援 (NLS) API。 例如,使用 NLS 函式來比較字串、取得文化特性資訊,以及在適當的文化特性中執行字串大小寫轉換。
從 .NET 5 開始,如果應用程式是在 Windows 10 2019 年 5 月更新或更新版本上執行,.NET 程式庫預設會使用 ICU 全球化 API。
注意
Windows 10 2019 年 5 月更新和更新的版本會挾帶 ICU 原生程式庫。 如果 .NET 執行階段無法載入 ICU,則會改用 NLS。
行為的差異
即使您不知道您使用的是全球化工具,也可能會在應用程式中看到變更。 本節列出您可能會看到的數個行為變更,但除此之外還有其他變更。
String.IndexOf
請考慮以下呼叫 String.IndexOf(String) 以在字串中尋找新行字元索引的程式碼。
string s = "Hello\r\nworld!";
int idx = s.IndexOf("\n");
Console.WriteLine(idx);
- 在 Windows 上的 .NET Core 3.1 和更早版本中,程式碼片段會列印
6
。 - 在採用 Windows 10 2019 年 5 月更新及更新版本的 .NET 5 中,程式碼片段會列印
-1
。 - 在 .NET 6 和更新版本中,程式碼片段會列印
6
,但是仍會使用 ICU 程式庫。
如要藉由進行序數搜尋而非區分文化特性的搜尋來修正此程式碼,請呼叫 IndexOf(String, StringComparison) 多載,並傳入 StringComparison.Ordinal 作為引數。
您可以執行程式碼分析規則 CA1307:指定 StringComparison 以提升明確性和 CA1309:使用循序的 StringComparison,以在程式碼中找到這些呼叫站台。
如需詳細資訊,請參閱 .NET 5+ 上比較字串時的行為變更。
貨幣符號
假設下列程式碼使用貨幣格式規範 C
來設定字串格式。 目前執行緒的文化特性會設定為只包含語言而不包含國家或地區的文化特性。
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("de");
string text = string.Format("{0:C}", 100);
- 在 Windows 上的 .NET Core 3.1 和更早版本中,文字的值為
"100,00 €"
。 - 在採用 Windows 19H1 及更新版本的 .NET 5 和更新版本中,文字的值為
"100,00 ¤"
,其會使用國際貨幣符號而非歐元。 ICU 的設計是,貨幣為國家或地區的屬性,而不是語言。
星期幾縮寫
DateTimeFormatInfo.GetShortestDayName(DayOfWeek) 方法會取得指定一週中指定日的最短縮寫日名稱。
- 在 Windows 上的 .NET Core 3.1 和更早版本中,這些星期幾縮寫包含兩個字元,例如 "Su"。
- 在 .NET 5 和更新版本中,這些星期幾縮寫只包含一個字元,例如 "S"。
變更原因
引進這項變更是為了統一 .NET 在所有受支援作業系統中的全球化行為。 應用程式也因此得以一同加入自身的全球化程式庫,而不用依賴作業系統的內建程式庫。
導入的版本
.NET 5.0
建議的動作
開發人員無須採取任何動作。 不過,如果您想要繼續使用 NLS 全球化 API,可以設定執行階段參數,以還原為該行為。 如需可用參數的詳細資訊,請參閱 .NET 全球化和 ICU 一文。
受影響的 API
- System.Span<T>
- System.String
- System.Globalization 命名空間中的多數類型
- System.Array.Sort (排序字串陣列時)
- System.Collections.Generic.List<T>.Sort() (清單項目是字串)
- System.Collections.Generic.SortedDictionary<TKey,TValue> (索引鍵是字串)
- System.Collections.Generic.SortedList<TKey,TValue> (索引鍵是字串)
- System.Collections.Generic.SortedSet<T> (集合包含字串)