Нормализация и сортировка
Некоторые символы Юникода имеют несколько эквивалентных двоичных представлений, которые состоят из наборов несамостоятельных и/или составных знаков Юникода. Из этого следует, что две строки могут выглядеть одинаково, а фактически состоять из разных символов. Наличие нескольких представлений одного символа затрудняет действия по сортировке. Решением этой проблемы является нормализация каждой строки и последующее порядковое сравнение, используемое для сортировки.
В стандарте Юникода определен процесс, называемый нормализацией, который возвращает одно двоичное представление символа при наличии нескольких эквивалентных представлений. Стандарт Юникода определяет четыре различных алгоритма, которые называются формами нормализации и используются для нормализации строки. Каждая форма нормализации следует различным правилам и поэтому возвращает разное двоичное представление входной строки. Однако если в одну и ту же форму нормализуются две строки, можно выполнить их последовательное сравнение с помощью порядкового (без учета регистра) сравнения.
Порядковое сравнение двух строк представляет собой двоичное сравнение числового значения (или кодовой точки) каждой соответствующей пары структур Char в двух объектах String, представляющих нормализованные строки. В платформе .NET Framework предусмотрено несколько методов, с помощью которых выполняется порядковое сравнение.
Для нормализации и сортировки строк в приложении можно использовать следующий процесс.
Получите две строки, которые следует отсортировать, из входного источника, например файла или пользовательского ввода.
Метод String.Normalize() используется для нормализации обеих строк в форму нормализации C, а метод String.Normalize(NormalizationForm) — для нормализации обеих строк в форму по выбору пользователя.
Для сравнения двух строк следует воспользоваться порядковым сравнением строк или методом Compare(String, Int32, String, Int32, Int32, StringComparison) с Ordinal, или значением OrdinalIgnoreCase. Операция сравнения определяет, предшествует ли лексически первая строка второй, или две строки являются лексически равными.
Выведите строки в отсортированных выходных данных на основании результатов, полученных на этапе 3. Если строки не равны, выведите строки в порядке возрастания или убывания.
Если строки равны, любая из них может быть выведена первой, пока не появится возможность упорядочить их в соответствии с другими характеристиками, отличными от лексического порядка. Например, если в приложении выполняется сортировка имен файлов и свойства каждого файла заносятся в выходные данные, то одинаковые имена файлов могут быть записаны в порядке дат создания этих файлов.
Повторяйте этот процесс, пока не будут отсортированы все вводимые данные.
Дополнительные сведения о поддержке формы нормализации в .NET Framework см. в описании перечисления NormalizationForm. Дополнительные сведения нормализации строки см. в методе Normalize.
Дополнительные сведения о нормализации, декомпозиции символов и равенстве см. в правиле 15 стандарта Юникода "Формы нормализации Юникода" на начальной странице Юникода.
См. также
Основные понятия
Сортировка в соответствии с региональными параметрами
Сравнение и сортировка данных для конкретного языка и региона