.NET 7 以降のバージョンでは、Windows Server 2019 で実行する場合、グローバリゼーション機能のために Unicode (ICU) ライブラリ用の国際コンポーネント が使用されます。 Windows のサーバー以外のエディションでは 、.NET 5 以降、ICU が使用されています。 ただし、.NET 7 では、以前のバージョンの Windows クライアント (特に Windows 10 バージョン 1703、1709、1803、1809) で ICU の読み込みのサポートが導入されました。
以前の動作
.NET 5 および .NET 6 では、.NET ライブラリは Windows Server 2019 のグローバリゼーション機能に 各国語サポート (NLS) API を使用しました。 たとえば、NLS 関数は、文字列の比較、カルチャ情報の取得、適切なカルチャでの文字列の大文字と小文字の使い分けの実行に使用されていました。 この動作は、1703、1709、1803、1809 などの Windows 10 クライアント バージョンにも適用されます。
新しい動作
.NET 7 以降では、アプリが Windows Server 2019 または Windows 10 クライアント バージョン 1703、1709、1803、1809 で実行されている場合、.NET ライブラリでは既定で ICU グローバリゼーション API が使用されます。 (. NET 5 以降、サーバー以外の Windows バージョンでは既に 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 クライアント バージョン 1703、1709、1803、1809 の .NET 5 および .NET 6 では、テキストの値は
"100,00 €"
。 - Windows Server 2019 の .NET 7 または Windows 10 クライアント バージョン 1703、1709、1803、1809 では、テキストの値は
"100,00 ¤"
され、ユーロではなく国際通貨記号が使用されます。 ICU では、通貨は言語ではなく、国または地域のプロパティであるという設計です。
変更の理由
- .NET では、など、ICU ライブラリに依存するいくつかの API が導入されました。 Windows Server 2019 でこのような API を使用する必要があるユーザーは、ICU アプリ ローカル機能を使用して、バイナリと共に ICU ライブラリを手動で展開する必要がありました。 ライブラリを使用しているアプリやサービスで ICU ライブラリを強制的にインストールすることを制御できないライブラリにコードを含めることができるため、これは優れたソリューションではありませんでした。
- Windows Server 2019 がクラウド プラットフォーム (Azure など) によって自動的に提供される場合、デプロイされたサービスは、必ずしもそのようなサーバーで実行されるとは限りません。 また、サービス所有者は、ICU バイナリをデプロイする場合/タイミングを管理する必要があります。 さらに、新しい .NET ICU 依存 API を使用する Windows Server 2019 を使用してクラウドにデプロイされるすべてのサービスでは、サービスと共に ICU バイナリをデプロイする必要があります。 これにより、サーバー上のディスクのサイズが大きくなります。
- 一部のユーザーは、Unicode 標準に準拠しているため、既定で ICU を使用することを好みます。
導入されたバージョン
.NET 7
推奨されるアクション
Windows Server 2019 または Windows 10 クライアント バージョン 1703、1709、1803、または 1809 で .NET 7 を使用している場合は、アプリまたはサービスを出荷する前にテストして、動作が期待どおりに動作し、ユーザーを中断しないようにすることをお勧めします。
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> (セットに文字列が含まれている場合)
こちらも参照ください
.NET