Подтвердить что ты не робот

Декодирование с двойной кодировкой utf8 в Python

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

Исходная строка из дампа tcp:

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

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

u'Rafa\xc5\x82'

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

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

В результате получается правильная строка:

u'Rafa\u0142' 

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

4b9b3361

Ответ 1

>>> s = u'Rafa\xc5\x82'
>>> s.encode('raw_unicode_escape').decode('utf-8')
u'Rafa\u0142'
>>>

Ответ 2

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

>>> 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, которую вы затем декодируете как обычно.

Ответ 3

>>> weird = u'Rafa\xc5\x82'
>>> weird.encode('latin1').decode('utf8')
u'Rafa\u0142'
>>>

latin1 - это просто аббревиатура для метода Richie nuts'n'bolts.

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