Расшифровка с двойным кодированием utf8 в Python - PullRequest
22 голосов
/ 24 июля 2009

У меня проблема со строками, которые я получаю от одного из моих клиентов через xmlrpc. Он посылает мне строки utf8, которые кодируются дважды :( поэтому, когда я получаю их в python, у меня есть объект Unicode, который должен быть декодирован еще раз, но, очевидно, python не позволяет этого. Я заметил, что мой клиент, однако мне нужносделать быстрый обходной путь, пока он не исправит это.

Необработанная строка из дампа tcp:

<string>Rafa\xc3\x85\xc2\x82</string>

это преобразуется в:

u'Rafa\xc5\x82'

Лучшее, что мы получаемis:

eval(repr(u'Rafa\xc5\x82')[1:]).decode("utf8") 

Это приводит к правильной строке, которая:

u'Rafa\u0142' 

это работает, однако, ужасно чертовски и не может быть использовано в рабочем коде. Если кто-нибудь знает, как это исправитьПроблема более подходящим способом, пожалуйста, напишите. Спасибо, Крис

Ответы [ 3 ]

44 голосов
/ 24 июля 2009
>>> s = u'Rafa\xc5\x82'
>>> s.encode('raw_unicode_escape').decode('utf-8')
u'Rafa\u0142'
>>>
3 голосов
/ 24 июля 2009

Ага, это было весело!

>>> original = "Rafa\xc3\x85\xc2\x82"
>>> first_decode = original.decode('utf-8')
>>> as_chars = ''.join([chr(ord(x)) for x in first_decode])
>>> result = as_chars.decode('utf-8')
>>> result
u'Rafa\u0142'

Итак, вы делаете первое декодирование, получая строку Unicode, где каждый символ на самом деле является байтовым значением UTF-8. Вы проходите через целочисленное значение каждого из этих символов, чтобы вернуться к подлинной строке UTF-8, которую затем декодируете как обычно.

2 голосов
/ 24 июля 2009
>>> weird = u'Rafa\xc5\x82'
>>> weird.encode('latin1').decode('utf8')
u'Rafa\u0142'
>>>

latin1 - это просто сокращение от метода гайки и болта Ричи.

Очень любопытно, что серьезно не описанный кодек raw_unicode_escape дает тот же результат, что и latin1 в этомкейс. Они всегда дают один и тот же результат? Если так, то почему такой кодек? Если нет, то было бы предпочтительно точно знать, как именно клиент OP выполнял преобразование из 'Rafa\xc5\x82' в u'Rafa\xc5\x82', а затем точно повернуть этот процесс в обратном порядке - в противном случае мы могли бы открепиться, если другие данные возникнут до того, как двойное кодирование станетисправлена.

...