Влияние языка и региональных параметров на строки в Visual Basic
Обновлен: Ноябрь 2007
В этом разделе справки рассматривается, как Visual Basic использует информацию о языковых и региональных параметрах для выполнения строковых преобразований и сравнений.
Когда использовать строки, специфичные для языковых и региональных параметров
Обычно следует использовать строки, специфичные для языковых и региональных параметров, для всех данных, адресованных пользователям, и строки, не зависящие от языковых и региональных параметров, для внутренних данных приложения.
Например, если приложение запрашивает пользователя на ввод данных как строки, оно должно ожидать, что пользователь введет строку, соответствующую формату его языковых и региональных параметров, и приложение должно соответственно конвертировать эту строку. Если приложение затем представляет эти данные в пользовательский интерфейс, оно должно представлять их в формате языковых и региональных параметров пользователя.
Однако, если приложение загружает данные на центральный сервер, оно должно отформатировать строку в соответствии с одними определенными языковыми и региональными параметрами для предотвращения путаницы между потенциально разными форматами данных.
Функции, чувствительные к языковым и региональным параметрам
Все функции преобразования строк Visual Basic (кроме Str и Val) используют информацию о языковых и региональных параметрах, к которой принадлежит пользователь, чтобы проверить, что преобразования и сравнения соответствуют ей.
Ключом к успеху в использовании функций преобразования строк в приложениях, выполняющихся на компьютерах с разными настройками языковых и региональных параметров является понимание того, какие функции используют специфичные установки для языковых и региональных параметров, а какие — текущие. Следует иметь ввиду, что установки приложения для языковых и региональных параметров по умолчанию наследуются из установок для языковых и региональных параметров операционной системы. Дополнительные сведения см. в разделах Функции Asc, AscW, Функции Chr, ChrW, Функция Format, Функция Hex (Visual Basic), Функция Oct и Функции преобразования типов.
Функции Str (преобразование чисел в строки) и Val (преобразование строк в числа) не используют информацию приложения о языковых и региональных параметрах при преобразовании между строками и числами. Напротив, они распознают только точку (.) в качестве допустимого десятичного разделителя. Аналогами этих функций, учитывающими особенности языковых и региональных параметров, являются:
Преобразования, использующие текущие установки языковых и региональных параметров. Функции CStr и Format преобразуют число в строку, а функции CDbl и CInt преобразуют строку в число.
Преобразования, использующие специфические установки языковых и региональных параметров. Каждый числовой объект имеет метод ToString(IFormatProvider), который преобразует число в строку, и метод Parse(String, IFormatProvider), преобразовывающий строку в число. Например, тип Double предоставляет методы ToString(IFormatProvider) и Parse(String, IFormatProvider).
Дополнительные сведения см. в разделах Функция Str и Функция Val.
Использование определенных языковых и региональных параметров
Допустим, что разрабатывается приложение, которое отправляет дату (форматированную как строку) веб-службе. В этом случае приложение должно использовать определенные языковые и региональные параметры для преобразования строки. Чтобы объяснить, зачем это нужно, рассмотрим результат использования метода даты ToString(): если приложение использует этот метод для форматирования даты "July 4, 2005", он возвращает "7/4/2005 12:00:00 AM" при работе с установкой "United States English (en-US)" и "04.07.2005 00:00:00" при работе с установкой "German (de-DE)".
При необходимости переобразовать строку в специфичный для языковых и региональных параметров формат, следует использовать класс CultureInfo, встроенный в .NET Framework. Можно создать новый объект CultureInfo для определенных языковых и региональных параметров, передав имя этих параметров конструктору CultureInfo. Поддерживаемые имена языковых и региональных параметров приведены в разделе справки для класса CultureInfo.
С другой стороны, можно получить экземпляр независимых языковых и региональных параметров от свойства CultureInfo.InvariantCulture. Независимые языковые и региональные параметры основаны на английских языковых и региональных параметрах, но существуют некоторые различия. Например, независимые языковые и региональные параметры использует 24-часовой формат времени вместо 12-часового.
Для преобразования даты в строку, специфичную для определенных языковых и региональных параметров, передайте объект CultureInfo методу объекта данных ToString(IFormatProvider). Например, следующий код отображает "07/04/2005 00:00:00" независимо от установок приложения для языковых и региональных параметров.
Dim d As Date = #7/4/2005#
MsgBox(d.ToString(System.Globalization.CultureInfo.InvariantCulture))
Примечание. |
---|
Буквы даты всегда преобразуются в соответствии с английскими языковыми и региональными параметрами. |
Сравнение строк
Существуют две важные ситуации, когда необходимы сравнения строк:
Сортировка данных для отображения пользователю. Используйте операции, основанные на текущих установках языковых и региональных параметров, чтобы строки можно было соответственно отсортировать.
Принятие решения о том, существует ли точное соответствие между двумя строками, используемыми внутри приложения (обычно для целей безопасности). Используйте операции, которые не зависят от текущих установок языковых и региональных параметров.
Оба типа сравнения можно выполнить при помощи функции Visual Basic StrComp. Опишите дополнительный аргумент Compare для управления типом сравнения: Text для большей части ввода и вывода, Binary для определения точных соответствий.
Функция StrComp возвращает целочисленное значение, отражающее связь между двумя сравниваемыми строками на основе порядка сортировки. Положительное значение означает, что первая строка "больше" второй. Отрицательный результат возвращается в случае, если первая строка "меньше" второй, а нулевое значение отражает равенство между строками.
' Defines variables.
Dim TestStr1 As String = "ABCD"
Dim TestStr2 As String = "abcd"
Dim TestComp As Integer
' The two strings sort equally. Returns 0.
TestComp = StrComp(TestStr1, TestStr2, CompareMethod.Text)
' TestStr1 sorts after TestStr2. Returns -1.
TestComp = StrComp(TestStr1, TestStr2, CompareMethod.Binary)
' TestStr2 sorts before TestStr1. Returns 1.
TestComp = StrComp(TestStr2, TestStr1)
Можно также использовать подобный функции StrComp метод String.Compare .NET Framework. Это статический перегруженный метод базового строкового класса. Следующий пример иллюстрирует использование этого метода:
Dim myString As String = "Alphabetical"
Dim secondString As String = "Order"
Dim result As Integer
result = String.Compare(myString, secondString)
Для более совершенного управления способом выполнения сравнений можно использовать дополнительные перегрузки метода Compare. С методом String.Compare можно использовать аргумент comparisonType для указания используемого типа сравнения.
Значение для аргумента comparisonType |
Тип сравнения |
Условия использования |
---|---|---|
Сравнение на основе байтов, составляющих строку. |
Используйте это значение при сравнении: идентификаторов, чувствительных к регистру, установок, относящихся к безопасности, или других нелингвистических идентификаторов, где байты должны точно соответствовать. |
|
Сравнение на основе байтов, составляющих строку. OrdinalIgnoreCase использует информацию независимых языковых и региональных параметров для определения того, что два символа отличаются только регистром. |
Используйте это значение при сравнении: идентификаторов, не чувствительных к регистру, установок, относящихся к безопасности, или данных, хранящихся в Windows. |
|
Сравнение на основе интерпретации строк с текущей установкой языковых и региональных параметров. |
Используйте это значение при сравнении: данных, отображаемых пользователю, большинства пользовательского ввода и других данных, требующих лингвистической интерпретации. |
|
Сравнение на основе интерпретации строк с независимой установкой языковых и региональных параметров. Оно отличается от Ordinal и OrdinalIgnoreCase, поскольку независимые языковые и региональные параметры рассматривают символы, не входящие в их диапазон установок, как эквиваленты независимых символов. |
Используйте эти значения только при сравнении сохраняемых данных или отображении лингвистических данных, требующих фиксированного порядка сортировки. |
Вопросы безопасности
Если приложение принимает решение, связанное с безопасностью, на основе результата сравнения или операции изменения регистра, то необходимо использовать метод String.Compare и передать Ordinal или OrdinalIgnoreCase в качестве аргумента comparisonType.