Ответ 1
>>> s = u'Rafa\xc5\x82' >>> s.encode('raw_unicode_escape').decode('utf-8') u'Rafa\u0142' >>>
У меня проблема со строками, которые я получаю от одного из моих клиентов по сравнению с 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'
это работает, однако, является уродливым, и не может быть использовано в производственном коде. Если кто-нибудь знает, как решить эту проблему более подходящим образом, напишите. Благодаря, Крис
>>> s = u'Rafa\xc5\x82' >>> s.encode('raw_unicode_escape').decode('utf-8') u'Rafa\u0142' >>>
Да, это было весело!
>>> 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, которую вы затем декодируете как обычно.
>>> 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'
, а затем, чтобы обратить вспять этот процесс точно - иначе мы могли бы отклеиться, если разные данные появятся до того, как двойное кодирование будет исправлена.