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


Как культура влияет на строки в Visual Basic

На этой странице справки рассматривается, как Visual Basic использует культурную информацию для выполнения преобразования строк и их сравнения.

Когда следует использовать строки Culture-Specific

Как правило, следует использовать строки, зависящие от культуры, для всех данных, представляемых пользователям, а также инвариантные строки для внутренних данных приложения.

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

Однако если приложение отправляет дату на центральный сервер, оно должно отформатировать строку в соответствии с одним языком и региональными параметрами, чтобы предотвратить путаницу между потенциально разными форматами дат.

Culture-Sensitive Функции

Все функции преобразования строк Visual Basic (за исключением функций Str и Val) используют языковые и региональные настройки приложения, чтобы убедиться, что преобразования и сравнения соответствуют языку и региональным настройкам пользователя приложения.

Ключ успешного использования функций преобразования строковых данных в приложениях, работающих на компьютерах с разными настройками языка и регионов, заключается в том, чтобы понять, какие функции используют определенные настройки языка и региона, а какие используют текущие языковые и региональные параметры. Обратите внимание, что региональные настройки приложения по умолчанию унаследованы от языковых и региональных настроек операционной системы. Дополнительные сведения см. в разделе Asc, AscW, ChrChrWFormat, Hex, Octи Функции преобразования типов.

Функции Str (преобразовывают числа в строки) и Val (преобразует строки в числа) не используют сведения о языках и региональных параметрах приложения при преобразовании между строками и числами. Вместо этого они распознают только период (.) как допустимый десятичный разделитель. Известные в культуре аналоги этих функций:

  • Преобразования, использующие текущую культуру. CStr Функции Format преобразуют число в строку, а CDblCInt функции преобразуют строку в число.

  • Преобразования, использующие определенную культуру. Каждый объект number имеет ToString(IFormatProvider) метод, который преобразует число в строку, и Parse(String, IFormatProvider) метод, который преобразует строку в число. Например, тип Double предоставляет ToString(IFormatProvider) методы и Parse(String, IFormatProvider) методы.

Дополнительные сведения см. в разделах Str и Val.

Использование определенной культуры

Представьте, что вы разрабатываете приложение, которое отправляет дату (отформатированную как строку) в веб-службу. В этом случае ваше приложение должно использовать специфическую культуру для преобразования строк. Чтобы проиллюстрировать это, рассмотрим результат использования метода даты ToString(): если приложение использует этот метод для форматирования даты 4 июля 2005 года, оно возвращает "7/4/2005 12:00:00 AM" при использовании английской (en-US) культуры Соединённых Штатов, но возвращает "04.07.2005 00:00:00" при использовании немецкой (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 before testStr2. Returns -1.
testComp = StrComp(testStr1, testStr2, CompareMethod.Binary)
' testStr2 sorts after testStr1. Returns 1.
testComp = StrComp(testStr2, testStr1, CompareMethod.Binary)

Вы также можете использовать партнера функции StrComp в .NET Framework, метод String.Compare. Это статический перегруженный метод базового строкового класса. В следующем примере показано, как используется этот метод:

Dim myString As String = "Alphabetical"
Dim secondString As String = "Order"
Dim result As Integer
result = String.Compare(myString, secondString)

Для более точного контроля над выполнением сравнений можно использовать дополнительные перегрузки метода Compare. String.Compare С помощью метода можно использовать аргумент, чтобы указать, какой тип сравнения следует использоватьcomparisonType.

Значение аргумента comparisonType Тип сравнения Когда следует использовать
Ordinal Сравнение на основе байтов компонентов строк. Используйте это значение при сравнении: идентификаторы с учетом регистра, параметры, связанные с безопасностью, или другие нелингвистические идентификаторы, в которых байты должны точно соответствовать.
OrdinalIgnoreCase Сравнение на основе байтов компонентов строк.

OrdinalIgnoreCase использует сведения о инвариантной культуре для определения, когда два символа различаются только в регистре.
Используйте это значение при сравнении: идентификаторы, не зависящие от регистра, параметры безопасности и данные, хранящиеся в Windows.
CurrentCulture или CurrentCultureIgnoreCase Сравнение на основе интерпретации строк в текущей культуре. Используйте эти значения при сравнении: данные, отображаемые пользователю, большинству входных данных пользователей и другим данным, требующим лингвистической интерпретации.
InvariantCulture или InvariantCultureIgnoreCase Сравнение на основе интерпретации строк в инвариантной культуре.

Это отличается от Ordinal и OrdinalIgnoreCase, поскольку инвариантная культура обрабатывает символы вне принятого диапазона как эквивалентные инвариантные символы.
Используйте эти значения только при сравнении сохраняемых данных или отображении лингвистических данных, требующих фиксированного порядка сортировки.

Соображения безопасности

Если ваше приложение принимает решения по безопасности на основе результата операции сравнения или изменения регистра, то операция должна использовать метод String.Compare, и использовать Ordinal или OrdinalIgnoreCase в качестве аргумента comparisonType.

См. также