共用方式為


全球化 API 在 Windows Server 2019 上使用 ICU 函式庫

.NET 7 和更新版本在 Windows Server 2019 上執行時,使用 國際化組件庫 (ICU) 提供全球化的功能。 自 .NET 5 以來,非伺服器版本的 Windows 一直使用 ICU。 不過,.NET 7 引進了在舊版 Windows 用戶端中載入 ICU 的支援,特別是 Windows 10 版本 1703、1709、1803 和 1809。

先前的行為

在 .NET 5 和 .NET 6 中,.NET 連結庫在 Windows Server 2019 上使用 國家語言支援 (NLS) API 進行全球化功能。 例如,NLS 函式被用來比較字串、取得文化資訊,以及在適當的文化環境中執行字串大小寫。 此行為也會套用至 Windows 10 用戶端版本,例如 1703、1709、1803 和 1809。

新行為

從 .NET 7 開始,如果應用程式在 Windows Server 2019 或 Windows 10 用戶端版本 1703、1709、1803 和 1809 上執行,.NET 連結庫預設會使用 ICU 全球化 API。 (自 .NET 5 以來,非伺服器 Windows 版本已經使用 ICU,因此這些版本沒有變更。

行為的差異

即使您未意識到您使用的是全球化設施,您仍可能會看到應用程式中的變更。 下列範例顯示您可能會看到的行為變更之一,但也有其他變更。

貨幣符號

請考慮使用貨幣格式規範 C來格式化字串的下列程序代碼。 目前線程的文化特性會設定為只包含語言而非國家或地區的文化特性。

System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("de");
string text = string.Format("{0:C}", 100);
  • 在 Windows Server 2019 或 Windows 10 用戶端版本 1703、1709、1803 和 1809 上的 .NET 5 和 .NET 6 中,文字的值是 "100,00 €"
  • 在 Windows Server 2019 或 Windows 10 用戶端版本 1703、1709、1803 和 1809 上的 .NET 7 中,文字的值是 "100,00 ¤",它會使用國際貨幣符號而非歐元。 在ICU中,設計是貨幣是國家或地區的屬性,而不是語言。

變更的原因

  • .NET 引進了一些相依於 ICU 連結庫的 API,例如 TimeZoneInfo.TryConvertIanaIdToWindowsId(String, String)。 需要想要在 Windows Server 2019 上使用這類 API 的使用者,才能使用 ICU 應用程式本機功能,以二進位檔手動部署 ICU 連結庫。 這不是一個理想的解決方案,因為程式碼可能位於某個程式庫中,而無法強制使用該程式庫的應用程式或服務安裝ICU程式庫。
  • 如果雲端平台自動提供 Windows Server 2019(例如 Azure),則已部署的服務不一定知道它會在這類伺服器上執行。 此外,服務擁有者必須管理是否/何時部署ICU二進位檔。 此外,所有使用 Windows Server 2019 部署至雲端並想要使用新 .NET 依賴 ICU API 的服務都必須隨服務一起部署 ICU 二進位檔。 這可能會膨脹伺服器上的磁碟大小。
  • 某些用戶預設偏好使用ICU,因為它更符合Unicode標準。

推出的版本

.NET 7

如果您在 Windows Server 2019 或 Windows 10 用戶端版本 1703、1709、1803 或 1809 上使用 .NET 7,建議您先測試您的應用程式或服務,再將其寄送,以確保行為如預期般運作,且不會中斷任何使用者。

如果你想繼續使用 NLS 全球化 API,可以設定運行時開關恢復該行為。 如需可用選項的詳細資訊,請參閱 .NET 全球化和ICU 一文。

受影響的 API

另請參閱