У меня есть строки, содержащие два похожих символа.Оба выглядят как маленькие 'a с огонеком:
ą
ą
(Примечание: в зависимости от рендера онииногда отображаются одинаково, иногда немного по-другому)
Однако они отличаются:
Характеристики 1-го символа:
В PostgreSQL:
select ascii('ą');
ascii
-------
261
Кодировка UTF-8 в шестнадцатеричном формате: \xC4\x85
, поэтому это предварительно составленный символ (https://en.wikipedia.org/wiki/Precomposed_character)
Характеристики 2-го символа:
В PostgreSQL:
select ascii('ą');
ascii
-------
97
(аналогично символу 'a')
Это сильно указывает на то, что отображаемый символобъединены из двух символов. И это действительно:
Кодировка UTF-8 в шестнадцатеричном формате: \x61\xCC\xA8
Так что это комбинация
a \x61\
и комбинационный символ (https://en.wikipedia.org/wiki/Combining_character), отдельный огонек:
̨ \xCC\xA8
Я хочу использовать PostgreSQL Левенштейн функционалn, чтобы определить сходство слов, и поэтому я хочу, чтобы оба символа рассматривались как одинаковые (как это, разумеется, подразумевают люди, которые пишут имя отличительного объекта с 1-м или 2-м символом).
Я предполагал, что могу использовать unaccent , чтобы всегда избавляться от огонека, но это не работает во 2-м случае:
1-й символ: ожидаемый результат:
select levenshtein('ą', 'x');
levenshtein
-------------
1
1-й символ: ожидаемый результат:
select levenshtein(unaccent('ą'), 'x');
levenshtein
-------------
1
2-й символ: ожидаемый результат:
select levenshtein('ą', 'x');
levenshtein
-------------
2
2-й символ: неожиданный результат:
select levenshtein(unaccent('ą'), 'x');
levenshtein
-------------
2
Итак,когда я сравниваю оба символа с levenshtein и unaccent , результат равен 1:
select levenshtein(unaccent('ą'), unaccent('ą'));
levenshtein
-------------
1
вместо 0.
Как я могу "«избавиться от огонек» во 2-м случае?
(Как) можно использовать коды строк UTF-8 для получения достигнутого результата?
Редактировать :Как предложил @ s-man, добавление комбинирующего символа к unaccent.rules
решит эту конкретную проблему.Но чтобы решить проблему с предварительно составленным символом и комбинированным символом с unaccent , мне нужно было бы явно добавить / изменить каждый отсутствующий / "неправильно сконфигурированный" комбинированный символ, чтобы/ в конфиге.