Выполнение смены регистра независимо от языка и региональных параметров
Обновлен: Ноябрь 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.
См. также
Ссылки
Другие ресурсы
Выполнение строковых операций, не зависящих от языка и региональных параметров