Как исправить двойные и искаженные строки в Python? - PullRequest
0 голосов
/ 27 апреля 2018

Мой процесс связан с искаженными данными. Я могу сказать, что он был дважды закодирован в UTF-8, но это только половина дела. Двойное декодирование работает только для кодовых точек, которые являются однобайтовыми (латинскими) и которые проходят через UTF-8 без потерь. Двухбайтовые (или большие) кодовые точки не могут быть дважды декодированы с использованием .decode('utf-8').encode('raw_unicode_escape').decode('utf-8')

У меня есть пример, который поможет понять это. Одна из строк, через которые я прошел, это:

'\xc3\x82\xc2\xa9\xc3\x82\xc2\xae\xc3\xa2\xe2\x80\x9e\xc2\xa2'

Это должно разрешить до:

u'\xa9\xae\u2122'

Первые две кодовые точки для символов (c) и (r) не нуждаются в суррогатных парах и поэтому очень явно присутствуют в необработанных байтах. Однако последний символ, символ (tm), является 16-битной кодовой точкой и искажается любым процессом, который это сделал.

Если я отрежу строку до этой точки, то смогу успешно дважды декодировать:

'\xc3\x82\xc2\xa9\xc3\x82\xc2\xae'.decode('utf-8').encode('raw_unicode_escape').decode('utf-8')

Однако, это не работает для всей строки, потому что первое декодирование приводит к этому:

u'\xc2\xa9\xc2\xae\xe2\u201e\xa2'

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

1 Ответ

0 голосов
/ 27 апреля 2018

Хорошо, поэтому мне просто нужно было сделать некоторые предположения о кодировке, пока я не нашел решение. Проблема в том, что данные были также закодированы в cp1252 (возможно, потому что данные поступают из системы Windows). Решение состоит в том, чтобы позвонить .decode('utf-8').encode('cp1252').decode('utf-8') и вуаля :

>>> raw = '\xc3\x82\xc2\xa9\xc3\x82\xc2\xae\xc3\xa2\xe2\x80\x9e\xc2\xa2'
>>> print raw.decode('utf-8').encode('cp1252').decode('utf-8')
©®™

Я надеюсь, что кто-то еще получит помощь, наткнувшись на это!

Нашел, что тоже помогло:

https://gist.github.com/litchfield/1282752/653b0c1944741ac90ca9c63c25ee3c2f609b323b

...