Настраиваемые правила сопоставления регистра и сортировки
Сопоставления регистра, алфавитный порядок и соглашения для упорядочивания элементов отличаются в зависимости от языка и региональных параметров. Необходимо помнить об этих различиях и понимать, что они могут явиться причиной того, что результаты строковых операций будут различаться в зависимости от языка и региональных параметров.
Уникальные правила сопоставления для турецкого алфавита являются примером того, насколько сопоставления верхнего и нижнего регистра различаются в разных языках, даже если большинство букв в них одинаковы. В большинстве латинских алфавитов символ "I" (код Юникода 0069) — это вариант символа "I" (код Юникода 0049) в нижнем регистре. Однако в турецком алфавите существует две версии символа "I": с точкой и без точки. В турецком алфавите символ "I" (код Юникода 0049) рассматривается как вариант другого символа "I" (код Юникода 0131) в верхнем регистре. Символ "I" (код Юникода 0069) рассматривается как вариант нижнего регистра для еще одного знака "I" (код Юникода 0130). В результате сравнение без учета регистра строк, содержащих знаки "I" (код Юникода 0069) и "I" (код Юникода 0049), которое было бы успешным для большинства языков и региональных параметров, невозможно для языка и региональных параметров "Турецкий (Турция)", обозначенных как "tr-TR".
Примечание |
---|
В языке и региональных параметрах "Азербайджанский (Азербайджан, латиница)", обозначаемых "az-Latn-AZ" также используется это правило сопоставления регистра. |
В следующем примере кода демонстрируется, как, в зависимости от языка и региональных параметров, различаются результаты операции String.Compare без учета регистра для строк, содержащих слова "FILE" и "file". При сравнении возвращается значение true, если свойству Thread.CurrentThread.CurrentCulture присвоено значение языка и региональных параметров "Английский (США)", обозначаемых "en-US". При сравнении возвращается значение false, если текущим языку и региональным параметрам присвоено значение "Турецкий (Турция)", которое обозначается как "tr-TR".
Imports System
Imports System.Globalization
Imports System.Threading
Public Class TurkishISample
Public Shared Sub Main()
' Set the CurrentCulture property to English in the U.S.
Thread.CurrentThread.CurrentCulture = New CultureInfo("en-US")
Console.WriteLine("Culture = {0}", _
Thread.CurrentThread.CurrentCulture.DisplayName)
Console.WriteLine("(file == FILE) = {0}", String.Compare("file", _
"FILE", True) = 0)
' Set the CurrentCulture property to Turkish in Turkey.
Thread.CurrentThread.CurrentCulture = New CultureInfo("tr-TR")
Console.WriteLine("Culture = {0}", _
Thread.CurrentThread.CurrentCulture.DisplayName)
Console.WriteLine("(file == FILE) = {0}", String.Compare("file", _
"FILE", True) = 0)
End Sub
End Class
using System;
using System.Globalization;
using System.Threading;
public class TurkishISample
{
public static void Main()
{
// Set the CurrentCulture property to English in the U.S.
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
Console.WriteLine("Culture = {0}",
Thread.CurrentThread.CurrentCulture.DisplayName);
Console.WriteLine("(file == FILE) = {0}", (string.Compare("file",
"FILE", true) == 0));
// Set the CurrentCulture property to Turkish in Turkey.
Thread.CurrentThread.CurrentCulture = new CultureInfo("tr-TR");
Console.WriteLine("Culture =
{0}",Thread.CurrentThread.CurrentCulture.DisplayName);
Console.WriteLine("(file == FILE) = {0}", (string.Compare("file",
"FILE", true) == 0));
}
}
Приведенные ниже выходные данные иллюстрируют различие результатов для разных языков и региональных параметров, поскольку в результате сравнения знаков "I" и "I" без учета регистра возвращается значение true для языка и региональных параметров "en-US" и false для "tr-TR".
Culture = English (United States)
(file == FILE) = True
Culture = Turkish (Turkey)
(file == FILE) = False
Дополнительные настраиваемые правила сопоставления регистра и сортировки
В дополнение к уникальным правилам сопоставления регистра в турецком и азербайджанском алфавитах, существуют другие настраиваемые правила сопоставления регистра и сортировки, о которых следует помнить при выполнении строковых операций. Алфавиты девяти языков в диапазоне ASCII (коды Юникода от 0000 до 007F) содержат пары букв, для которых сравнение без учета регистра, например с помощью метода String.Compare, дает отрицательный результат, если регистры различаются. К ним относятся следующие языки и региональные параметры:
Хорватский (Хорватия), "hr-HR"
Чешский (Чешская Республика), "cs-CZ"
Словацкий (Словакия), "sk-SK"
Датский (Дания), "da-DK"
Норвежский (Букмол, Норвегия), "nb-NO"
Норвежский (Ньюнорск, Норвегия), "nn-NO"
Венгерский (Венгрия), "hu-HU"
Вьетнамский (Вьетнам), "vi-VN"
Испанский (Испания, традиционная сортировка), "es-ES_tradnl"
Например, в датском языке двухбуквенные пары "aA" и "AA" при сравнении без учета регистра не рассматриваются как одинаковые. Во вьетнамском алфавите двухбуквенные пары "nG" и "NG" при сравнении без учета регистра не рассматриваются как одинаковые. Хотя необходимо знать, что эти правила существуют, на практике очень редко встречаются ситуации, когда сравнения этих пар, зависящие от языка и региональных параметров, создают проблемы, потому что они нехарактерны для фиксированных строк или идентификаторов.
Алфавиты шести языков в диапазоне ASCII имеют стандартные правила сопоставления регистра, но различные правила сортировки. К ним относятся следующие языки и региональные параметры:
Эстонский (Эстония), "et-EE"
Финский (Финляндия), "fi-FI"
Венгерский (Венгрия, технический порядок сортировки), "hu-HU_technl"
Литовский (Литва), "lt-LT"
Шведский (Финляндия), "sv-FI"
Шведский (Швеция), "sv-SE"
Например, в шведском алфавите при сортировке буква "w" считается совпадающей с буквой "v". При разработке приложений наблюдается тенденция к сокращению использования операций сортировки в пользу проверок на равенство, что уменьшает риск возникновения проблем.
Еще в 35 языках существуют особые правила сопоставления регистра и сортировки вне диапазона ASCII. Эти правила обычно ограничены алфавитом, используемым для конкретного языка. Поэтому вероятность возникновения проблем из-за них мала.
Подробные сведения об особых вариантах сопоставления регистра и правилах сортировки, которые применяются для конкретных языков и региональных параметров, см. в описании стандарта на домашней странице Юникода (на английском языке).
См. также
Основные понятия
Строковые операции, не зависящие от языка и региональных параметров
Другие ресурсы
Выполнение строковых операций, не зависящих от языка и региональных параметров