Поделиться через


Выполнение смены регистра независимо от языка и региональных параметров

Обновлен: Ноябрь 2007

Методы String.ToUpper, String.ToLower, Char.ToUpper и Char.ToLower предоставляют перегрузки, которые не принимают никакие параметры. По умолчанию эти перегрузки без параметров выполняют изменения регистра, основанные на значении CultureInfo.CurrentCulture. Это приводит к результатам, зависящим от регистра, которые могут меняться в зависимости от языка и региональных параметров. Чтобы точно показать, когда нужны изменения регистра, учитывающие язык и региональные параметры, а когда — не учитывающие, необходимо использовать перегрузки этих методов, которые требуют явного задания параметра culture. Для изменения регистра с учетом языка и региона параметру culture необходимо задать значение CultureInfo.CurrentCulture. Для изменения регистра независимо от языка и региона параметру culture необходимо задать значение CultureInfo.InvariantCulture.

Обычно строки приводятся к стандартному регистру для облегчения последующего просмотра. Когда используется этот способ, параметру culture необходимо задать значение CultureInfo.InvariantCulture, так как значение Thread.CurrentCulture может измениться в период между изменением регистра и выполнением поиска.

Если решение безопасности зависит от операции изменения регистра, она не должна зависеть от языка и региона, чтобы гарантировать, что на результат не повлияет значение параметра CultureInfo.CurrentCulture. Пример, показывающий возникновение несогласованных результатов при выполнении не зависящих от языка и региона строковых операций, см. в разделе Пользовательские правила сопоставления регистра и сортировки.

Использование методов String.ToUpper и String.ToLower

Для получения более понятного кода рекомендуется всегда использовать перегрузки методов String.ToUpper и String.ToLower, которые позволяли бы явно задавать параметр culture. Например, следующий код производит поиск идентификатора. Операция key.ToLower является по умолчанию зависящей от языка и региона, но это явно не показано в коде.

Пример

Shared Function LookupKey(key As String) As Object
   Return internalHashtable(key.ToLower())
End Function
static object LookupKey(string key) 
{
    return internalHashtable[key.ToLower()];
}

Чтобы сделать операцию key.ToLower не зависящей от языка и региона, измените приведенный выше пример кода так, как показано ниже, для явного использования CultureInfo.InvariantCulture при изменении регистра.

Shared Function LookupKey(key As String) As Object
    Return internalHashtable(key.ToLower(CultureInfo.InvariantCulture))
End Function
static object LookupKey(string key) 
{
    return internalHashtable[key.ToLower(CultureInfo.InvariantCulture)];
}

Использование методов Char.ToUpper и Char.ToLower

Хотя методы Char.ToUpper и Char.ToLower обладают такими же характеристиками, как методы String.ToUpper и String.ToLower, единственные языки, для которых это имеет значение, — это "tr-TR" (турецкий – Турция) и "az -AZ-Latn" (азербайджанский (латиница) – Азербайджан). Изменение регистра одиночного символа отличается только в этих двух языках. Более подробные сведения об этом уникальном сопоставлении регистра см. в разделе Пользовательские правила сопоставления регистра и сортировки. Для получения более понятного кода и непротиворечивых результатов рекомендуется всегда использовать перегрузки этих методов, позволяющие явно задавать параметр culture.

См. также

Ссылки

String.ToUpper

String.ToLower

Char.ToUpper

Char.ToLower

Другие ресурсы

Выполнение строковых операций, не зависящих от языка и региональных параметров