Почему ᏌᏊ ᎢᏳᎾᎵᏍᏔᏅ ᏍᎦᏚᎩ родное название США? - PullRequest
0 голосов
/ 13 ноября 2018

Когда я использую этот код:

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 «Апрель 2018 обновление»), .NET Framework 4.7.2.)


Обновление: это не соответствует, даже на той же машине. Например, я пытался открыть PowerShell очень много раз, каждый раз вставляя в него [System.Globalization.RegionInfo]'US'. Кажется, что в течение длительного времени все экземпляры PowerShell последовательно дают один и тот же результат. Но через некоторое время экземпляры PowerShell дают противоположный результат. Вот скриншот двух окон, одно из которых последовательно имеет одно NativeName, а другое последовательно имеет противоположное. Поэтому должно быть какое-то недетерминированное определение (без различий в корпусе):

PowerShell windows

1 Ответ

0 голосов
/ 13 ноября 2018

Первое, что следует отметить, это то, что конструктор для RegionInfo находит регион , находя культуру, используемую в этом регионе .Таким образом, он ищет язык в этой стране, а не только в стране.

При чтении этого исходного кода, похоже, что разница в верхнем / нижнем регистре заключается в том, как выполняется поиск, если не указана культурас регионом.

Например, сначала он пытается сделать несколько вещей, но , а затем попытается посмотреть в статический список областей .Но поскольку он использует Dictionary.ContainsKey, это поиск с учетом регистра.Таким образом, если вы укажете "US", он найдет его, но не "us".

Позже, он найдет во всех культурах (из CultureInfo.GetCultures(CultureTypes.SpecificCultures)) регион, который вы указали, но он делает это без учета регистра.

Я не могу подтвердить, так как не могу просмотреть этот код, но я предполагаю, что, поскольку он проходит по списку по порядку, он будетдоберитесь до chr-Cher-US, прежде чем доберетесь до en-US.

Почему это не согласовано?

В одном из комментариев говорится, что LinqPad находит Cherokee даже при использовании верхнегодело.Я не знаю, почему это так.Мне удалось воспроизвести это, но я также обнаружил, что в Visual Studio это английский язык при использовании "US" и Cherokee при использовании "us", как вы описали.Но я обнаружил, что если я включаю «Использовать экспериментальные сборки Roslyn» в LinqPad, то он возвращает английский для "US" и "us".Так что, возможно, это как-то связано с точной целевой версией времени выполнения, я не могу сказать наверняка.

Одна вещь, которая влияет на согласованность, - это кеширование : первое, что будет сделано, когдаон не получает полного соответствия по культуре + регион - проверяет кэш уже найденных культур .Это строчные буквы всех ключей в этом кеше, поэтому этот кеш не учитывает регистр.

Вы можете проверить это.Мы знаем, что использование "US" против "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;

Оба результата всегда будут одинаковыми, потому что первая культура кэшируется и используется для следующей.

Возможно, что существует код вне вашего кода, который вызывает те же методы и заканчивает кэшированием значения культуры, тем самым изменяярезультат, который вы получаете, когда делаете то же самое.

Заключение

Все, что сказано, документы фактически говорят :

Мы рекомендуем использовать имя-для культуры примера, «EN-US» на английском языке (США) -в доступ к свойству NativeName.

Так что это немного тооСуть: вы просили регион, а не язык.Если вам нужен конкретный язык, попросите этот язык, а не только регион.

Если вы хотите гарантировать английский, то либо:

  1. Сделайте, как рекомендует Microsoft, и укажите языкс регионом: "en-US" или
  2. Используйте свойства EnglishName или DisplayName (которые являются английскими, даже если NativeNameЧероки).
...