Question

J'ai un problème avec des chaînes que je reçois d'un de mes clients plus xmlrpc. Il me envoie des chaînes UTF8 qui sont encodées deux fois :( quand je les reçois en python j'ai un objet unicode qui doit être décodé une fois de plus, mais de toute évidence python ne permet pas. Je l'ai remarqué mon client mais je dois faire solution rapide pour l'instant avant qu'il ne le fixe.

chaîne brute de vidage tcp:

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

est converti en:

u'Rafa\xc5\x82'

Le meilleur que nous obtenons est:

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

Il en résulte chaîne correcte qui est:

u'Rafa\u0142' 

cela fonctionne est cependant laid comme l'enfer et ne peut pas être utilisé dans le code de production. Si quelqu'un sait comment résoudre ce problème de manière plus appropriée s'il vous plaît écrire. Merci, Chris

Était-ce utile?

La solution

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

Autres conseils

Yow, qui était amusant!

>>> 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'

Alors vous faites le premier décodage, obtenir une chaîne Unicode où chaque caractère est en fait une valeur d'octet UTF-8. Vous allez par la valeur entière de chacun de ces caractères pour revenir à une véritable chaîne UTF-8, vous décodez alors normalement.

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

latin1 est juste une abréviation pour la méthode nuts'n'bolts de Richie.

Il est très curieux que le codec raw_unicode_escape sérieusement sous-décrit donne le même résultat que latin1 dans ce cas. Est-ce qu'ils donnent toujours le même résultat? Si oui, pourquoi avoir un tel codec? Dans le cas contraire, il serait préférable de savoir exactement comment le client de l'OP a la transformation de 'Rafa\xc5\x82' à u'Rafa\xc5\x82' puis d'inverser ce processus exactement - sinon on pourrait se décoller si les différentes cultures des données avant la double encodage est fixé

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top