Tuesday, June 14, 2011

Unicode Collation Algorithm для чайников

Зачем вообще что-то сортировать? Зачем сортировать строки Unicode?
Коротко: это позволяет осуществлять и человеку, и машине поиск данных проще.
Этому вопросу посвящен целый раздел в стандарте Unicode (смотрите TR10).
Коротко, каждому символу назначаем свой "вес". Группы определённых символов могут иметь вес, отличный от их веса по отдельности.
Вес необходимо брать из DUCET (табличка, файлик, сделано до нас).
Весовой элемент состоит из четырёх частей: уровней (level). Первый - основной (base), второй - определяет, что это за символ (или часть). Черточки, кружочки, точечки над, под (и так далее) имеют свой второй уровень 2. Для "обычного" текста L2 предсказуем.
L3, case level, или регистр, предсказуем тоже: для "обычного" текста там двойки.
L4 это "особый" уровень - для тонкой сортировки. Обычно это просто код символа. Почему особый? Потому что в реальной жизни ограничиваются первыми тремя (и в примерах на сайте Unicode их тоже только три).

Строка, представленная в виде массива весов называется sort array, но этот массив только промежуточное звено для достижения нашей цели.

Уровни, веса... А как сортировать все равно непонятно. Веса нужны, чтобы представить строку в виде двоичной последовательности, которую удобно сравнивать стандартными средствами языка программирования. Для этого образуем двоичную последовательность: возьмем все первые веса (отбросим веса с весом 0), также возьмем все вторые, третьи и соединим их в одно целое, разделив нулями. Теперь получившуюся последовательность, которая называется sort key, можно сравнивать.

Правда, всё сложнее в реальном мире.

No comments:

Post a Comment