Descodificar utf8 codificado duplo em Python
Pergunta
Eu tenho um problema com as cordas que eu recebo de um de meus clientes mais xmlrpc. Ele me envia utf8 cordas que são codificados duas vezes :( por isso, quando eu pegá-los em python Eu tenho um objeto unicode que tem de ser decodificado mais uma vez, mas, obviamente, python não permite isso. Eu observei meu cliente no entanto necessidade I para fazer solução rápida para agora, antes que ele resolve o problema.
string Raw de despejo tcp:
<string>Rafa\xc3\x85\xc2\x82</string>
Este é convertido em:
u'Rafa\xc5\x82'
O melhor que temos é:
eval(repr(u'Rafa\xc5\x82')[1:]).decode("utf8")
Isso resulta em seqüência correta que é:
u'Rafa\u0142'
isso funciona, porém, é feio como o inferno e não pode ser usado no código de produção. Se alguém sabe como resolver este problema em escrever por favor caminho mais adequado. Obrigado, Chris
Solução
>>> s = u'Rafa\xc5\x82' >>> s.encode('raw_unicode_escape').decode('utf-8') u'Rafa\u0142' >>>
Outras dicas
Yow, que foi divertido!
>>> 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'
Então você faz o primeiro decodificar, recebendo uma seqüência de caracteres Unicode, onde cada personagem é realmente um valor de byte UTF-8. Você ir via o valor inteiro de cada um desses personagens para voltar para uma verdadeira UTF-8 cordas, que você, em seguida, decodificação como normal.
>>> weird = u'Rafa\xc5\x82'
>>> weird.encode('latin1').decode('utf8')
u'Rafa\u0142'
>>>
latin1 é apenas uma abreviatura para o método nuts'n'bolts de Richie.
É muito curioso que o codec raw_unicode_escape
seriamente sub-descrito dá o mesmo resultado que latin1
neste caso. Será que eles sempre dar o mesmo resultado? Se assim for, por que tal codec um? Se não, seria preferível para saber ao certo exatamente como cliente do OP fez a transformação de 'Rafa\xc5\x82'
para u'Rafa\xc5\x82'
e, em seguida, para reverter esse processo exatamente - caso contrário, poderia vir unstuck se de dados diferente surge antes da dupla codificação é fixo