Нормализация Юникода

Есть ли возможный путь нормализации, который приводит обе строки ниже к одному и тому же значению?

  • u'Aho\xe2\u20ac\u201cCorasick_string_matching_algorithm'
  • u'Aho\u2013Corasick string matching algorithm'

1 ответ

Решение

Похоже, у вас есть Mojibake, байты UTF-8, которые были декодированы так, как если бы они были данными Windows-1252. Ваши 3 "символа", закодированные в Windows-1252, дают точные 3 байта UTF-8 для символа U+2013 EN DASH в целевой строке:

>>> u'\u2013'.encode('utf8')
'\xe2\x80\x93'
>>> u'\u2013'.encode('utf8').decode('windows-1252')
u'\xe2\u20ac\u201c'

Вы можете использовать ftfy модуль для восстановления этих данных, так что вы получите emdash для байтов:

>>> import ftfy
>>> sample = u'Aho\xe2\u20ac\u201cCorasick_string_matching_algorithm'
>>> ftfy.fix_text(sample)
u'Aho\u2013Corasick_string_matching_algorithm'

затем просто замените подчеркивания пробелами:

>>> ftfy.fix_text(sample).replace('_', ' ')
u'Aho\u2013Corasick string matching algorithm'

Вы также можете просто кодировать в Windows-1252 и снова декодировать как UTF-8, но это не всегда работает, потому что есть определенные байты, которые не могут быть юридически декодированы как Windows-1252, но некоторые системы, производящие эти моджибаке, делают это в любом случае. ftfy включает в себя специальные ремонтные кодеки, чтобы полностью изменить этот процесс. Кроме того, он обнаруживает конкретные ошибки Mojibake, сделанные для автоматизации процесса при множественных возможных ошибках кодека.

Другие вопросы по тегам