Как отличить guish между правильной и ошибочной строкой в ​​кодировке Unicode в Python? - PullRequest
1 голос
/ 23 января 2020

У меня есть строковые данные на разных языках, где части строк видели неправильное кодирование / декодирование, в то время как другие верны, мне нужно исправить неправильные:

Вот пример немецкого слова "Zubehör" ":

correct = "ZUBEHÖR"
incorrect = "ZUBEHÃ\x96R"

Я уже обнаружил, что могу исправить ошибки следующим образом:

incorrect.encode("raw_unicode_escape").decode("utf8")

Однако использование этого в правильных строках приводит к ошибке. Я мог бы перебрать все строки и использовать try -статист, но я не знаю, будет ли это работать надежно, и я хотел бы узнать более элегантный способ.

Также пока \x96 при печати записывается только один символ:

incorrect[-3]
Out[34]: 'Ã'

incorrect[-2]
Out[33]: '\x96'

Как надежно найти только те строки, в которых есть эти нечетные символы Юникода, например ZUBEHÃ\x96R?

РЕДАКТИРОВАТЬ:

Вот еще кое-что, с чем я столкнулся во время эксперимента:

Когда я делаю incorrect.encode("raw_unicode_escape"), тогда получается b'ZUBEH\xc3\x96R'.

Но когда я делаю это, например, с кириллицей c слово, подобное этому:

"Персонализированные".encode("raw_unicode_escape")

Тогда результат будет b'\\u041f\\u0435\\u0440\\u0441\\u043e\\u043d\\u0430\\u043b\\u0438\\u0437\\u0438\\u0440\\u043e\\u0432\\u0430\\u043d\\u043d\\u044b\\u0435'

Почему я получаю \x -эскейпс в первом случае и \u -эскейпс во втором Если вы делаете точно такую ​​же вещь?

И почему я .decode("utf8") могу вернуть \x -эскейпс в читаемый формат, но не \u -эскейпс?

1 Ответ

1 голос
/ 23 января 2020

Вы должны попробовать библиотеку fixes-text-for-you ( ftfy ):

>>> import ftfy
>>> ftfy.fix_text("ZUBEHÃ\x96R")
'ZUBEHÖR'

Она работает построчно, так что если у вас есть строка с чистой и испорченной Строки, но в отдельных строках, ftfy, вероятно, может справиться с этим.

Примечание: Это не точная наука. То, как работает ftfy, подразумевает множество догадок. Инструмент очень хорошо сделан, но он может не угадать правильно во всех ваших случаях. Если вы можете, всегда лучше исправить ошибки в источнике (ie. Убедитесь, что весь текст в первую очередь правильно декодирован).

...