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

StackOverflow https://stackoverflow.com/questions/1177316

  •  19-09-2019
  •  | 
  •  

Вопрос

У меня проблема со строками, которые я получаю от одного из моих клиентов через 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's nuts'n'bolts method.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top