Windows Server 2019 の ICU ライブラリを使用するグローバリゼーション API

.NET 7 以降のバージョンは、Windows Server 2019 で実行されると、グローバリゼーション機能に International Components for Unicode (ICU) ライブラリが使用されます。 Windows の非サーバー エディションは、.NET 5 以降は ICU を使用しています。 ただし、.NET 7 では、以前の Windows クライアントバージョン、特に Windows 10 バージョン 1703、1709、1803、1809 で ICU を読み込むサポートが導入されました。

以前の動作

.NET 5 と .NET 6 では、Windows Server 2019 でのグローバリゼーション機能に各国語サポート (NLS) API が .NET ライブラリで使用されます。 たとえば、NLS 関数は、文字列の比較、カルチャ情報の取得、適切なカルチャでの文字列の大文字と小文字の使い分けの実行に使用されていました。 この動作は、1703、1709、1803、1809 などの Windows 10 クライアント バージョンにも適用されました。

新しい動作

.NET 7 以降では、アプリが Windows Server 2019 または Windows 10 Client バージョン 1703、1709、1803、1809 で実行されている場合、ICU グローバリゼーション API が既定で .NET ライブラリにより使用されます。 (サーバー以外の Windows バージョンでは、既に .NET 5 以降で ICU が使用されているため、これらのバージョンに変更はありません)。

動作の違い

グローバリゼーション機能を使用していることを認識していない場合でも、アプリでの変更に気付くことがあります。 次の例は、表示される可能性があるいくつかの動作変更のうち 1 つを示しています。

通貨記号

通貨書式指定子 C を使用して文字列の書式を設定する次のコードについて考えます。 現在のスレッドのカルチャは、言語のみを含むカルチャに設定されており、国や地域は含まれません。

System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("de");
string text = string.Format("{0:C}", 100);
  • Windows Server 2019 または Windows 10 Client バージョン 1703、1709、1803、1809 の .NET 5 および .NET 6 では、テキストの値は "100,00 €" です。
  • Windows Server 2019 または Windows 10 Client バージョン 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 バイナリを展開するかどうか、または、いつするのかを管理する必要があります。 さらに、新しい .NET ICU 依存の API を使用する Windows Server 2019 を使用してクラウドに展開されるすべてのサービスは、サービスと共に ICU バイナリを展開する必要があります。 これにより、サーバー上のディスクのサイズが肥大します。
  • 一部のユーザーは、ICU が Unicode 標準に準拠しているため、既定で使用することを好みます。

導入されたバージョン

.NET 7

Windows Server 2019 または Windows 10 Client バージョン 1703、1709、1803、1809 で .NET 7 をお使いの場合は、アプリまたはサービスを出荷する前にテストして、動作が期待どおりに動作し、ユーザーに影響を与えないことを確認することをお勧めします。

NLS グローバリゼーション API を引き続きお使いになる場合は、ランタイム スイッチを設定して、その動作に戻すことができます。 使用可能なスイッチの詳細については、「.NET グローバリゼーションと ICU」の記事をご覧ください。

影響を受ける API

関連項目