20

このコードを使用すると:

var ri = new RegionInfo("us");
var nativeName = ri.NativeName;   // ᏌᏊ ᎢᏳᎾᎵᏍᏔᏅ ᏍᎦᏚᎩ

なぜnativeName文字列"ᏌᏊ ᎢᏳᎾᎵᏍᏔᏅ ᏍᎦᏚᎩ"チェロキー)なのですか?

new RegionInfo("US")(差分のみ、大文字)に変更すると、US代わりに が得られます"United States"

の好ましい使用法は、次のような特定のカルチャ情報文字列を与えることですRegionInfo

new RegionInfo("en-US")
new RegionInfo("chr-Cher-US")

など、それは機能します。しかし、小文字を使用する場合にのみ、チェロキー語が英語よりも優先されるのはなぜusですか?


(Windows 10 (バージョン 1803 "April 2018 Update")、.NET Framework 4.7.2 で見られます。)


更新: これは、同じマシン上であっても一貫性がありません。たとえば、貼り付けるたびに PowerShell を何度も開いてみ[System.Globalization.RegionInfo]'US'ました。長い間、PowerShell のすべてのインスタンスが一貫して同じ結果を出しているようです。しかし、しばらくすると、PowerShell のインスタンスが反対の結果をもたらします。これは、2 つのウィンドウのスクリーンショットです。一方には一貫して が表示NativeNameされ、もう一方には一貫して反対のウィンドウが表示されます。したがって、非決定論的な決定が行われている必要があります(大文字と小文字の違いはありません):

PowerShell ウィンドウ

4

1 に答える 1

8

最初に注意すべきことは、のコンストラクターはRegionInfo、その地域で使用されているカルチャを見つけることによって地域を見つけることです。つまり、国だけでなく、その国の言語を探しているのです。

そのソース コードを読むと、大文字と小文字の違いは、リージョンでカルチャが指定されていない場合にルックアップがどのように行われるかが原因のようです。

たとえば、最初にいくつかのことを試みますが、その後、地域の静的リストを調べようとします。ただし、 を使用しているためDictionary.ContainsKey、大文字と小文字を区別して検索します。したがって、 を指定"US"すると検索されますが、 は検索されません"us"

後で、指定した地域のすべてのカルチャ(からCultureInfo.GetCultures(CultureTypes.SpecificCultures)) を検索しますが、大文字と小文字を区別しない方法で検索します。

そのコードをステップ実行できないので確認できませんが、私の推測では、リストを順番に調べているため、 に到達するchr-Cher-US前に に到達しen-USます。

なぜ一貫していないのですか?

コメントの 1 つは、LinqPad は大文字を使用している場合でもチェロキーを検出すると述べています。これがなぜなのかわかりません。私はそれを複製することができましたが、Visual Studioでは、あなたが説明したよう"US"に、を使用するときは英語で、使用するときはチェロキーであることもわかりました"us"。しかし、LinqPad で「実験的な Roslyn アセンブリを使用する」をオンにすると、 と の両方"US"で英語が返されることがわかりまし"us"た。そのため、対象となる正確なランタイム バージョンと関係があるのか​​もしれませんが、確かなことは言えません。

一貫性に影響を与えることの 1 つはキャッシングです。カルチャ + リージョンで完全に一致しない場合に最初に行うことは、既に見つかったカルチャのキャッシュをチェックすることです。そのキャッシュ内のすべてのキーを小文字にするため、このキャッシュでは大文字と小文字が区別されません。

これをテストできます。"US"vs.を使用すると結果が異なることはわかってい"us"ますが、同じプログラムでこれを試してください。

var nativeNameus = new RegionInfo("us").NativeName;
var nativeNameUS = new RegionInfo("US").NativeName;

次に、それらを交換して再度実行します。

var nativeNameUS = new RegionInfo("US").NativeName;
var nativeNameus = new RegionInfo("us").NativeName;

最初のカルチャがキャッシュされ、次のカルチャに使用されるため、両方の結果は常に等しくなります。

同じメソッドを呼び出して最終的にカルチャ値をキャッシュするコードがコードの外部にある可能性があり、それによって、同じことを行ったときに得られる結果が変化します。

結論

そうは言っても、ドキュメントは実際には次のように言っています

NativeName プロパティにアクセスするには、カルチャ名 (英語 (米国) の場合は "en-US" など) を使用することをお勧めします。

したがって、それは少し議論の余地があります。言語ではなく、地域を要求したのです。特定の言語が必要な場合は、地域だけでなく、その言語を尋ねてください。

英語を保証したい場合は、次のいずれかを行います。

  1. Microsoft の推奨に従って、地域で言語を指定します: "en-US"、または
  2. EnglishNameまたはプロパティを使用します (がチェロキーDisplayNameであっても英語です)。NativeName
于 2018-11-13T16:53:07.757 に答える