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


Нормализация и сортировка

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

В стандарте Юникода определен процесс, называемый нормализацией, который возвращает одно двоичное представление символа при наличии нескольких эквивалентных представлений. Стандарт Юникода определяет четыре различных алгоритма, которые называются формами нормализации и используются для нормализации строки. Каждая форма нормализации следует различным правилам и поэтому возвращает разное двоичное представление входной строки. Однако если в одну и ту же форму нормализуются две строки, можно выполнить их последовательное сравнение с помощью порядкового (без учета регистра) сравнения.

Порядковое сравнение двух строк представляет собой двоичное сравнение числового значения (или кодовой точки) каждой соответствующей пары структур Char в двух объектах String, представляющих нормализованные строки. В платформе .NET Framework предусмотрено несколько методов, с помощью которых выполняется порядковое сравнение.

Для нормализации и сортировки строк в приложении можно использовать следующий процесс.

  1. Получите две строки, которые следует отсортировать, из входного источника, например файла или пользовательского ввода.

  2. Метод String.Normalize() используется для нормализации обеих строк в форму нормализации C, а метод String.Normalize(NormalizationForm) — для нормализации обеих строк в форму по выбору пользователя.

  3. Для сравнения двух строк следует воспользоваться порядковым сравнением строк или методом Compare(String, Int32, String, Int32, Int32, StringComparison) с Ordinal, или значением OrdinalIgnoreCase. Операция сравнения определяет, предшествует ли лексически первая строка второй, или две строки являются лексически равными.

  4. Выведите строки в отсортированных выходных данных на основании результатов, полученных на этапе 3. Если строки не равны, выведите строки в порядке возрастания или убывания.

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

  5. Повторяйте этот процесс, пока не будут отсортированы все вводимые данные.

Дополнительные сведения о поддержке формы нормализации в .NET Framework см. в описании перечисления NormalizationForm. Дополнительные сведения нормализации строки см. в методе Normalize.

Дополнительные сведения о нормализации, декомпозиции символов и равенстве см. в правиле 15 стандарта Юникода "Формы нормализации Юникода" на начальной странице Юникода.

См. также

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

Сортировка в соответствии с региональными параметрами

Сравнение и сортировка данных для конкретного языка и региона

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

Шифрование и локализация