Нормализация юникода не работает должным образом

В настоящее время я сталкиваюсь с некоторыми проблемами с различными представлениями юникода специальных символов, особенно с ударениями или диэрезами и так далее. Я написал скрипт на Python, который анализирует несколько дампов базы данных и сравнивает значения между ними. Проблема в том, что в разных файлах эти специальные символы хранятся по-разному. В одних файлах эти символы складываются, в других разлагаются. Поскольку я хочу, чтобы строка всегда извлекалась из дампа в составном представлении, я попытался добавить следующую строку:

value = unicodedata.normalize("NFC", value)

Однако это решает мою проблему только в некоторых случаях. Например, для умляутов это работает как положено. Тем не менее такие символы, как ë, останутся в декомпозированной схеме (e͏̈).

Я выяснил, что между e и символом diaeresis есть символ COMBINING GRAPHEME JOINER (U+034F). Это нормально или это может быть причиной моей проблемы?

Кто-нибудь знает, как справиться с этой проблемой?


person Sören Oldag    schedule 10.06.2015    source источник
comment
Я бы сказал, что если у вас есть COMBINING GRAPHEME JOINER, то это не просто так, но это зависит от языка текста (да, даже для diaeresis). Я склонен думать, что это не ошибка, поэтому вам не следует удалять его (если вы не хотите выполнять расслабленное сравнение), но вы должны спросить носителей этого языка: он также может быть там из-за оригинальное программное обеспечение для обработки текста, а не из-за языка.   -  person Adriano Repetti    schedule 10.06.2015


Ответы (1)


Целью U+034F COMBINING GRAPHEME JOINER является обеспечение того, чтобы определенные последовательности оставались различными при поиске/сортировке/нормализации. Это необходимо для правильной обработки символов и комбинирования меток, поскольку они используются в некоторых языках с алгоритмами Unicode. Из раздела 23.2 стандарта Unicode (стр. 805):

U + 034F, объединяющий графемный соединитель (CGJ), используется для воздействия на сопоставление соседних символов в целях сопоставления и поиска с учетом языка. Он также используется для различения последовательностей, которые в противном случае были бы канонически эквивалентны.

...

В свою очередь, это означает, что вставка объединяющего графемного соединения между двумя объединяющими метками не позволит нормализации переключить позиции этих двух объединяющих меток, независимо от их собственных объединяющих классов.

Как правило, вы не должны не удалять CGJ, не зная, почему он был вставлен в первую очередь.

person 一二三    schedule 11.06.2015