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


Настраиваемые правила сопоставления регистра и сортировки

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

Уникальные правила сопоставления для турецкого алфавита являются примером того, насколько сопоставления верхнего и нижнего регистра различаются в разных языках, даже если большинство букв в них одинаковы. В большинстве латинских алфавитов символ "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. Эти правила обычно ограничены алфавитом, используемым для конкретного языка. Поэтому вероятность возникновения проблем из-за них мала.

Подробные сведения об особых вариантах сопоставления регистра и правилах сортировки, которые применяются для конкретных языков и региональных параметров, см. в описании стандарта на домашней странице Юникода (на английском языке).

См. также

Основные понятия

Строковые операции, не зависящие от языка и региональных параметров

Другие ресурсы

Выполнение строковых операций, не зависящих от языка и региональных параметров