グローバリゼーション API では Windows 10 上の ICU ライブラリが使用される
.NET 5 以降のバージョンでは、Windows 10 May 2019 Update 以降で実行されると、グローバリゼーション機能用に International Components for Unicode (ICU) ライブラリが使用されます。
変更の説明
.NET Core 1.0 から 3.1 および .NET Framework 4 以降では、Windows でのグローバリゼーション機能のために各国語サポート (NLS) API が .NET ライブラリにより使用されます。 たとえば、NLS 関数は、文字列の比較、カルチャ情報の取得、適切なカルチャでの文字列の大文字と小文字の使い分けの実行に使用されていました。
.NET 5 以降では、アプリが Windows 10 May 2019 Update 以降で実行されている場合、ICU グローバリゼーション API が既定で .NET ライブラリにより使用されます。
注意
Windows 10 May 2019 Update 以降のバージョンには、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 May 2019 Update 以降のバージョン上の .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" のように 2 文字で構成されていました。
- .NET 5 以降のバージョンでは、これらの曜日の省略形は、"S" などの 1 文字のみで構成されます。
変更理由
この変更は、サポートされているすべてのオペレーティング システムで .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> (セットに文字列が含まれるとき)
関連項目
.NET