この破壊的変更は、次の 2 つの方法 でグローバリゼーションインバリアント モード に影響します。
- 以前は、カルチャ名が BCP-47 に準拠している限り、.NET では、グローバリゼーション インバリアント モードでカルチャを作成することができました。 ただし、イン バリアント カルチャ データは、実際のカルチャ データの代わりに使用されていました。 .NET 6 以降では、グローバリゼーション インバリアント モードでインバリアント カルチャ以外のカルチャを作成すると、例外がスローされます。
- 以前は、グローバリゼーション インバリアント モードでは、ASCII 文字の大文字と小文字のマッピングのみがサポートされました。 .NET 6 以降では、グローバリゼーション インバリアント モードでは、Unicode で定義されたすべての文字に対して完全な大文字と小文字のマッピングがサポートされます。 ケース マッピングは、文字列比較、文字列検索、文字列の大文字と小文字の使い分けなどの操作で使用されます。
グローバリゼーション インバリアント モードは、グローバリゼーション のサポートを必要としないアプリに使用されます。 つまり、アプリはカルチャ固有のデータと動作にアクセスせずに実行されます。 一部の Docker コンテナー (Alpine コンテナーなど) では、グローバリゼーション インバリアント モードが既定で有効になっています。
以前の動作
グローバリゼーション インバリアント モードが有効になっている以前の .NET バージョンでは、次の手順を実行します。
アプリがインバリアント カルチャではないカルチャを作成した場合、操作は成功しますが、返されるカルチャでは常に、実際のカルチャ データではなくインバリアント カルチャ データが使用されます。
ケースマッピングは、ASCII文字に対してのみ実行されました。 例えば次が挙げられます。
if ("Á".Equals("á", StringComparison.CurrentCultureIgnoreCase)) // Evaluates to false.
新しい動作
グローバリゼーション インバリアント モードが有効な場合の .NET 6 以降:
アプリがインバリアント カルチャではないカルチャを作成しようとすると、CultureNotFoundException 例外が投げられます。
ケース マッピングは、Unicode で定義されたすべての文字に対して実行されます。 例えば次が挙げられます。
if ("Á".Equals("á", StringComparison.CurrentCultureIgnoreCase)) // Evaluates to true.
導入されたバージョン
.NET 6
変更の理由
カルチャ作成の変更は、カルチャ関連の問題をより簡単に診断するために導入されました。 一部のユーザーは、グローバリゼーション インバリアント モードが有効になっている環境でアプリが実行されていることを認識できません。 予期しない動作が発生する可能性があり、グローバリゼーション インバリアント モードとの関連付けが行われないため、問題を診断するのは困難です。
グローバリゼーション インバリアント モードでの使いやすさとエクスペリエンスを向上するために、ケース マッピングの完全なサポートが導入されました。
推奨されるアクション
ほとんどの場合、アクションは必要ありません。 ただし、以前のカルチャ作成の動作が必要な場合は、グローバリゼーション インバリアント モードで任意のカルチャを作成できるようにランタイム構成オプションを設定できます。 詳細については、「 定義済みのカルチャ」を参照してください。
影響を受ける API
- CultureInfo
- System.Globalization.CultureInfo.CreateSpecificCulture(String)
- System.Globalization.CultureInfo.GetCultureInfo
- RegionInfo
- 文字列の大文字小文字の区別、比較、または検索を行う任意のAPI
こちらも参照ください
.NET