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

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top