Файлы таблиц сортировки (или “таблицы сравнения”) предназначены для указания всей характеризующей конкретный язык информации:
- какие символы относятся к алфавиту языка
- какова их последовательность в алфавите
- какие буквы (или сочетания букв) должны считаться эквивалентными при сравнении слов (например, поискового запроса и текста в словаре)
- каково соответствие строчных и заглавных букв алфавита
Основной характеристикой символа является вес (масса) – она характеризует его положение в таблице (в частности, в алфавите конкретного языка): символы с большей массой идут ниже символов с меньшей
Обычно кроме всех деталей по символам описываемого языка также добавляются секции с кириллическим алфавитом и латиницей (уже без детализации NATIVE/PAIR, которые описаны ниже). Это делается для того, чтобы с помощью текущей таблицы сравнения можно было сравнивать не только текст самого словаря (у которого указан используемый язык и символы которого точно описаны таблицей), но и другой текст, который пользователь мог, например, вставить в строку поиска из буфера обмена, и который использует совсем другой алфавит.
Рассмотрим пример части таблицы сортировки latin-based языка и ее тематических секций.
# - таким символов обозначены комментарии
# Пустые строчки игнорируются.
# "x" - внутри кавычек находится символ которому проставляется вес.
# xABCD - ABCD - шестнадцатиричный код символа.
# 12345 - 12345 - десятичный код символа.
# Символы могут быть перечислены через запятую - это значит, что все они между
# собой равны. Например:
# x20," ",32
# Кроме запятой между описаниями символов допустимы пробелы и символ табуляции.
# ВНИМАНИЕ!!! Все символы которые не описаны в данной таблице будут
# игнорироваться!
# Для задания соответствия символов верхнего и нижнего регистра для конкретной буквы конкретного алфавита (алфавита языка текущей таблицы сравнения) используется конструкция PAIR_NATIVE, например:
# "T", "t" = PAIR_NATIVE
# Первый символ - верхний регистр, второй символ - нижний регистр.
# Если один символ должен соответствовать нескольким, тогда это записывается так:
# "æ"="ae", данные о весах "a" и "e" будут взяты из соответсвующей строчки в
# которой описаны данные буквы.
# Если несколько символов должны располагаться в определенном месте, тогда
# это записывается так:
# "c", "C"
# .....
# "H", "h"
# "CH", "Ch", "cH", "ch"
# "I", "i"
# ВНИМАНИЕ!!! в данном случае оператор должен описать все варианты написания
# которые нужно уметь распознавать, в противном случае, варианты не описанные
# выше, будут распознаваться как обычные одиночные символы.
# Список символов для игнорирования.
###########################################################
# Символ для генерации ключей сортировки
x2744 = IGNORE
" ", ",", ".", ":", ";", "!", "?" = DELIMITER
"(", ")", "{", "}", "[", "]", "«", "»", "|", "" = IGNORE
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9" = IGNORE
x2022, x2023, x2024, x2025, x2026, x2027, x2028 = DELIMITER
# Пробелы
x2000, x2001, x2002, x2003, x2004, x2005, x2006 = DELIMITER
x2007, x2008, x2009, x200A, x200B, x200C, x200D = DELIMITER
# Тире
x2010, x2011, x2012, x2013, x2014, x2015 = DELIMITER
# Кавычки
x27, x2BC, x2EE = DELIMITER
"`", x22 = IGNORE
x2018, x2019, x201A, x201B, x201C, x201D, x201E = IGNORE
x201F, x2032, x2033, x2034, x2035, x2036, x2037 = IGNORE
# Combining marks
x300, x301, x302, x303, x304, x305, x306, x307 = IGNORE
# Кириллица
###########################################################
"А", "а"
"Б", "б"
"В", "в"
"Г", "Ґ", "г", "ґ" # Ураинская буква г - имеет немного иное звучание, список слов с такой буквой порядка 10.
"Д", "д"
"Е", "Ё", "е", "ё"
"Є", "є"
"Ж", "ж"
"З", "з"
"И", "и"
"І", "і" # Украинская и
"Ї", "ї" # Украинская йи
"Й", "й"
"Ј", "ј" # Буква Je
"К", "к"
"Л", "л"
"Љ", "љ" # Буква Lje
"М", "м"
"Н", "н"
"Њ", "њ" # Буква Nje
"О", "о"
"П", "п"
"Р", "р"
"С", "с"
"Т", "т"
"Ћ", "ћ" # Буква Tshe
"У", "у", "Ў", "ў"
"Ф", "ф"
"Х", "х"
"Ц", "ц"
"Ч", "ч"
"Ш", "ш"
"Щ", "щ"
"Ъ", "ъ"
"Ы", "ы"
"Ь", "ь"
"Э", "э"
"Ю", "ю"
"Я", "я"
# Латиница
###########################################################
# Þþ - Letter Thorn
# Ðð - Letter Eth - not D with stroke
# Ŋŋ - Latin letter Eng
# "ĸ" - Latin letter Kra
# ₫ - Vietnamese codepage "Dong Sign"
"A", "a", "À", "Á", "Â", "Ã", "Ä", "Å", "Ą", "Ă", "Ā", "Ǻ", "Ǎ", "Ǟ", "à", "á", "â", "ã", "ä", "å", "ą", "ă", "ā", "ǻ", "ǎ", "ǟ", "Ḁ", "ḁ", "ẚ", "Ạ", "ạ", "Ả", "ả", "Ấ", "ấ", "Ầ", "ầ", "Ẩ", "ẩ", "Ẫ", "ẫ", "Ậ", "ậ", "Ắ", "ắ", "Ằ", "ằ", "Ẳ", "ẳ", "Ẵ", "ẵ", "Ặ", "ặ"
"B", "b", "Ḃ", "ḃ", "Ḅ", "ḅ", "Ḇ", "ḇ"
"C", "c", "Ç", "Ć", "Č", "Ĉ", "Ċ", "ç", "ć", "č", "ĉ", "ċ", "Ḉ", "ḉ"
"D", "d", "Ď", "Đ", "ď", "đ", "Ḋ", "ḋ", "Ḍ", "ḍ", "Ḏ", "ḏ", "Ḑ", "ḑ", "Ḓ", "ḓ"
"E", "e", "È", "É", "Ê", "Ë", "Ę", "Ě", "Ē", "Ĕ", "Ė", "è", "é", "ê", "ë", "ę", "ě", "ē", "ĕ", "ė", "Ḕ", "ḕ", "Ḗ", "ḗ", "Ḙ", "ḙ", "Ḛ", "ḛ", "Ḝ", "ḝ", "Ẹ", "ẹ", "Ẻ", "ẻ", "Ẽ", "ẽ", "Ế", "ế", "Ề", "ề", "Ể", "ể", "Ễ", "ễ", "Ệ", "ệ"
"F", "f", "ƒ", "Ḟ", "ḟ", "ẛ"
"G", "g", "Ģ", "Ĝ", "Ğ", "Ġ", "Ǧ", "ģ", "ĝ", "ğ", "ġ", "ǧ", "Ḡ", "ḡ"
"H", "h", "Ĥ", "Ħ", "ĥ", "ħ", "Ḣ", "ḣ", "Ḥ", "ḥ", "Ḧ", "ḧ", "Ḩ", "ḩ", "Ḫ", "ḫ", "ẖ"
"I", "i", "Ì", "Í", "Î", "Ï", "Į", "Ī", "Ĩ", "Ĭ", "İ", "Ǐ", "ì", "í", "î", "ï", "į", "ī", "ĩ", "ĭ", "ı", "ǐ", "Ḭ", "ḭ", "Ḯ", "ḯ", "Ỉ", "ỉ", "Ị", "ị"
"J", "j", "Ĵ", "ĵ"
"K", "k", "Ķ", "ķ", "Ǩ", "ǩ", "Ḱ", "ḱ", "Ḳ", "ḳ", "Ḵ", "ḵ"
"L", "l", "Ł", "Ľ", "Ĺ", "Ļ", "Ŀ", "ł", "ľ", "ĺ", "ļ", "ŀ", "Ḷ", "ḷ", "Ḹ", "ḹ", "Ḻ", "ḻ", "Ḽ", "ḽ"
"M", "m", "Ḿ", "ḿ", "Ṁ", "ṁ", "Ṃ", "ṃ"
"N", "n", "Ń", "Ň", "Ņ", "ń", "ň", "ņ", "ʼn", "Ṅ", "ṅ", "Ṇ", "ṇ", "Ṉ", "ṉ", "Ṋ", "ṋ"
"Ñ", "ñ"
"O", "o", "Ò", "Ó", "Ô", "Õ", "Ö", "Ø", "Ő", "Ō", "Ơ", "Ŏ", "Ǒ", "Ṏ", "ò", "ó", "ô", "õ", "ö", "ø", "ő", "ō", "ơ", "ŏ", "ǒ", "ṏ", "Ṍ", "ṍ", "Ṑ", "ṑ", "Ṓ", "ṓ", "Ọ", "ọ", "Ỏ", "ỏ", "Ố", "ố", "Ồ", "ồ", "Ổ", "ổ", "Ỗ", "ỗ", "Ộ", "ộ", "Ớ", "ớ", "Ờ", "ờ", "Ở", "ở", "Ỡ", "ỡ", "Ợ", "ợ", "Ǫ", "ǫ", "Ǭ", "ǭ"
"P", "p", "Ṕ", "ṕ", "Ṗ", "ṗ"
"Q", "q"
"R", "r", "Ŕ", "Ř", "Ŗ", "ŕ", "ř", "ŗ", "Ṙ", "ṙ", "Ṛ", "ṛ", "Ṝ", "ṝ", "Ṟ", "ṟ"
"S", "s", "Š", "Ś", "Ş", "Ŝ", "š", "ś", "ş", "ŝ", "Ṣ", "ṣ", "Ṥ", "ṥ", "Ṧ", "ṧ", "Ṩ", "ṩ", "Ṡ", "ṡ"
"T", "t", "Ť", "Ţ", "Ŧ", "ť", "ţ", "ŧ", "Ṫ", "ṫ", "Ṭ", "ṭ", "Ṯ", "ṯ", "Ṱ", "ṱ", "ẗ"
"U", "u", "Ù", "Ú", "Û", "Ü", "Ů", "Ű", "Ū", "Ų", "Ư", "Ũ", "Ŭ", "Ǔ", "Ǚ", "Ǜ", "Ǘ", "Ǖ", "Ṻ", "Ṳ", "ù", "ú", "û", "ü", "ů", "ű", "ū", "ų", "ư", "ũ", "ŭ", "ǔ", "ǚ", "ǜ", "ǘ", "ǖ", "ṻ", "ṳ", "Ṵ", "ṵ", "Ṷ", "ṷ", "Ṹ", "ṹ", "Ụ", "ụ", "Ủ", "ủ", "Ứ", "ứ", "Ừ", "ừ", "Ử", "ử", "Ữ", "ữ", "Ự", "ự"
"V", "v", "Ṽ", "ṽ", "Ṿ", "ṿ"
"W", "w", "Ŵ", "ŵ", "Ẁ", "ẁ", "Ẃ", "ẃ", "Ẅ", "ẅ", "Ẇ", "ẇ", "Ẉ", "ẉ", "ẘ"
"X", "x", "Ẋ", "ẋ", "Ẍ", "ẍ"
"Y", "y", "Ý", "Ÿ", "Ŷ", "ý", "ÿ", "ŷ", "Ẏ", "ẏ", "ẙ", "Ỳ", "ỳ", "Ỵ", "ỵ", "Ỷ", "ỷ", "Ỹ", "ỹ"
"Z", "z", "Ž", "Ź", "Ż", "ž", "ź", "ż", "Ẑ", "ẑ", "Ẓ", "ẓ", "Ẕ", "ẕ"
# Лигатуры
###########################################################
"Æ"="ae"
"æ"="ae"
"Ǽ"="ae"
"ǽ"="ae"
"Œ"="oe"
"œ"="oe"
"ẞ"="ss"
"ß"="ss"
Символы алфавитов
Маркируются названиями секций “= SIMPLE” и “= COMPLEX”, но в большинстве случаев просто указывается только символ или несколько последовательно идущих символов. Они будут добавляться в секции SIMPLE и COMPLEX соответственно.
В качестве примера использования секции COMPLEX можно привести немецкий язык, в котором нужно задать соответствие “ß” = “ss” и позицию в алфавите для “ss”.
Игнорируемые символы
Отмечены как “= IGNORE”. Безмассовые символы, которые участвуют в сортировке и поиске только на самых поздних этапах (т.е. когда значимые символы совпали и начинается обычное бинарное сравнение строк). Также отдельные функции позволяют получить строку, из которой отфильтрованы все игнорируемые символы – список берется из данного раздела.
Символы-разделители
Секция “= DELIMITER” посвящена разделителям – безмассовым символам, которые используются при разбиении строк на отдельные слова (tokenization) – обычно к ним относятся, например, пробелы разной ширины, знак “=”, двоеточие и прочее.
Combining-символы
В секции “= COMBINING” перечислены комбинируемые диакритические знаки – соответствующий им диапазон Unicode начинается с U+0300. Также считаются символами, не имеющими массы.
Пробельные символы
При необходимости пробельные символы могут дополнительно маркироваться отдельно от остальных разделителей – для этого указывается директива “= SPACE” (впрочем, для практических задач обычно хватает символов-разделителей).
Символы алфавита текущего языка
Секция “= NATIVE” содержит символы алфавита языка, описываемого данной таблицей. Их требуется выделять явно потому, что таблица может содержать веса и для символов других алфавитов.
Таблица преобразования регистров
Таблица преобразования регистров (“= PAIR”) содержит пары символов, которые будут использоваться функциями преобразования из строчных букв в заглавные и обратно.