Почему ᏌᏊ ᎢᏳᎾᎵᏍᏔᏅ ᏍᎦᏚᎩ родное название США?

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

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

1 ответ

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

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

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

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

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

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

В одном из комментариев говорится, что LinqPad находит Cherokee даже при использовании верхнего регистра. Я не знаю, почему это так. Мне удалось воспроизвести это, но я также обнаружил, что в Visual Studio это английский при использовании "US" и чероки при использовании "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 это чероки).
Другие вопросы по тегам