Сравнение строк без учета языка и региональных параметров
Обновлен: Ноябрь 2007
По умолчанию метод Compare выполняет сравнение с учетом языка и региона и регистра символов. Однако доступна также перегрузка метода String.Compare, позволяющая задать используемый язык и регион с помощью параметра culture. В коде приложения необходимо четко указать, в каких случаях необходимо выполнять сравнение с учетом языка и региона. Для операций с учетом культурной среды необходимо указывать свойство CultureInfo.CurrentCulture в качестве параметра culture. Для операций без учета культурной среды необходимо указывать свойство CultureInfo.InvariantCulture в качестве параметра culture.
Если решение, влияющее на безопасность, основано на результате операции сравнения строк, она не должна зависеть от языка и региона, чтобы гарантировать, что на результат не повлияет значение параметра CultureInfo.CurrentCulture. Пример, показывающий возникновение несогласованных результатов при выполнении не зависящих от языка и региона операций сравнения строк, см. в разделе Пользовательские правила сопоставления регистра и сортировки.
По умолчанию перегрузки метода String.CompareTo выполняют сравнение с учетом языка и региона, а также регистра символов. Однако не существует перегрузок этого метода, которые бы позволяли проводить сравнения независимо от языка и региона. Для большей понятности кода рекомендуется использовать метод String.Compare вместо того, чтобы определять параметры CultureInfo.CurrentCulture для операций, зависящих от языка и региона, или CultureInfo.InvariantCulture для операций, не зависящих от культурной среды.
Использование метода String.Compare
В следующем примере показывается, как использовать метод String.Compare для сравнения строк string1 и string2 с учетом языка и региона, а также регистра символов. CultureInfo.CurrentCulture передается как параметр culture, показывая, что будут использоваться правила сопоставления регистра и сортировки для CurrentCulture.
Dim compareResult As Integer = String.Compare(string1, string2, False, CultureInfo.CurrentCulture)
int compareResult = String.Compare(string1, string2, false, CultureInfo.CurrentCulture);
Полный пример кода, показывающий применение метода String.Compare для проведения сравнений с учетом языка и региона, см. в разделе Сравнение и сортировка данных для определенного языка и региона.
Чтобы сделать эти операции не зависящими от языка и региона, необходимо определить CultureInfo.InvariantCulture в качестве параметра culture. Это определение показано в следующем примере.
Dim compareResult As Integer = String.Compare(string1, string2, False, CultureInfo.InvariantCulture)
int compareResult = String.Compare(string1, string2, false, CultureInfo.InvariantCulture);
В следующем примере показывается, как проводить сравнение строк без учета языка и региона с использованием приведенной выше строки кода.
Imports System
Imports System.Globalization
Public Class CompareSample
Public Shared Sub Main()
Dim string1 As String = "file"
Dim string2 As String = "FILE"
Dim compareResult As Integer = String.Compare(string1, string2, _
False, CultureInfo.InvariantCulture)
Console.WriteLine("A case-insensitive comparison of {0} and {1} is _
{2}", string1, string2, compareResult)
End Sub
End Class
using System;
using System.Globalization;
public class CompareSample
{
public static void Main()
{
String string1 = "file";
String string2 = "FILE";
int compareResult = String.Compare(string1, string2, false,
CultureInfo.InvariantCulture);
Console.WriteLine("A case-insensitive comparison of {0} and {1} is
{2}", string1, string2, compareResult);
}
}
Использование метода String.CompareTo
В следующем примере используется метод String.CompareTo для сравнения строк string1 и string2. По умолчанию это сравнение проводится с учетом языка и региона, а также регистра символов.
Dim compareResult As Integer = string1.CompareTo(string2)
int compareResult = string1.CompareTo(string2);
Поскольку параметр culture не передается явно, приведенный выше пример является неоднозначным. Чтобы четко определить, зависит или нет приложение от языка и региона, в приложении следует заменить метод String.CompareTo методом String.Compare. Если необходимо выполнить сравнение строк string1 и string2 с учетом языка и региона, а также регистра, следует передать CultureInfo.CurrentCulture в качестве параметра culture. Это приводит к тому, что используются правила сопоставления регистра и сортировки для CurrentCulture, как показано в следующем примере.
Dim compareResult As Integer = String.Compare(string1, string2, False, CultureInfo.CurrentCulture)
int compareResult = String.Compare(string1, string2, false, CultureInfo.CurrentCulture);
Если необходимо выполнить сравнение строк string1 и string2 без учета языка и региона и с учетом регистра, следует передать CultureInfo.InvariantCulture в качестве параметра culture. Это приводит к тому, что используются правила сопоставления регистра и сортировки для InvariantCulture, как показано в следующем примере.
Dim compareResult As Integer = String.Compare(string1, string2, False, CultureInfo.InvariantCulture)
int compareResult = String.Compare(string1, string2, false, CultureInfo.InvariantCulture);
Полный пример кода, показывающий применение метода String.Compare для получения результатов, не зависящих от языка и региона, см. в разделе Использование метода String.Compare.
См. также
Основные понятия
Сравнение и сортировка данных для конкретного языка и региона
Ссылки
Другие ресурсы
Выполнение строковых операций, не зависящих от языка и региональных параметров