2 мин чтения
Поиск и сортировка с новыми буквами: заметка для разработчиков
Реформа изменила текст, а значит изменила и базу, и поиск, и сортировку. Ниже — четыре ошибки, на которые натыкаются почти все.
Поиск ничего не находит
В базе Toshkent, пользователь вводит Toşkent — ноль совпадений. Решение одно: приводить и запрос, и индекс к одной форме до сравнения. К какой именно — неважно, важно что к одной и той же.
Сортировка идёт не в том порядке
По умолчанию ö и ğ уезжают после z, потому что у них больше код. В JavaScript нужен Intl.Collator("uz-Latn"), в PostgreSQL — COLLATE "uz-Latn-x-icu".
Турецкая i
Новые буквы есть и в турецком алфавите, поэтому возникает соблазн взять локаль tr как «похожую». Не берите: в турецкой локали "i".toUpperCase() даёт İ, а в узбекском нужна I. Только uz или без локали.
Нормализация Unicode
ö приходит и одним кодпоинтом, и как o с комбинирующей диерезой — второе типично для файлов с macOS. Прогоняйте весь входящий текст через normalize("NFC"), иначе две одинаково выглядящие строки окажутся неравными.
Апострофы
Люди наберут ', ’, `, ʻ и ʼ — всё сразу. На приёме сводите к одному знаку, на выводе всегда показывайте ʼ (U+02BC).