グローバリゼーション インバリアント モードでのカルチャの作成とケース マッピング
この破壊的変更は、次の 2 つの点で グローバリゼーション インバリアント モード に影響を与えます。
- 以前は、.NET では、カルチャ名が BCP-47 に準拠している限り、グローバリゼーション インバリアント モードで任意のカルチャを作成できました。 しかし、インバリアント カルチャ データが実際のカルチャ データの代わりに使用されていました。 .NET 6 以降では、グローバリゼーション インバリアント モードでインバリアント カルチャ以外のカルチャを作成すると、例外がスローされます。
- 以前は、グローバリゼーション インバリアント モードでサポートされるのは、ASCII 文字のケース マッピングのみでした。 .NET 6 以降では、Unicode で定義されたすべての文字に対する完全なケース マッピングがグローバリゼーション インバリアント モードでサポートされます。 ケース マッピングは、文字列比較、文字列検索、文字列の大文字と小文字の使い分けなどの操作で使用されます。
グローバリゼーション インバリアント モードは、グローバリゼーションのサポートを必要としないアプリに使用されます。 つまり、アプリはカルチャ固有のデータと動作にアクセスせずに実行されます。 グローバリゼーション インバリアント モードは、Alpine コンテナーなど、一部の Docker コンテナーで既定で有効になっています。
以前の動作
以前の .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