Frage

Ich habe ein Problem mit Streichern, die ich von einem meiner Kunden über xmlrpc bekommen. Er schickt mir utf8 Strings, die zweimal codiert werden :( so, wenn ich sie in Python zu bekommen Ich habe ein Unicode-Objekt, das ein weiteres Mal decodiert werden muss, aber offensichtlich nicht Python nicht zulassen. Ich habe meine Klienten jedoch bemerkt, ich brauche schnelle Abhilfe für jetzt tun, bevor er es behebt.

Raw-String aus tcp dump:

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

Dies wird umgewandelt in:

u'Rafa\xc5\x82'

Das Beste, was wir bekommen, ist:

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

Dies führt zu einer korrekten Zeichenfolge, die lautet:

u'Rafa\u0142' 

Dies funktioniert jedoch ist hässlich wie die Hölle und kann nicht in Produktionscode verwendet werden. Wenn jemand weiß, wie man dieses Problem in geeigneter Weise zu beheben bitte schreiben. Vielen Dank, Chris

War es hilfreich?

Lösung

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

Andere Tipps

Yow, der Spaß war!

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

So können Sie tun, um die ersten dekodieren, eine Unicode-Zeichenfolge erhalten, wobei jedes Zeichen ist eigentlich ein UTF-8-Byte-Wert. Sie gehen über den ganzzahligen Wert jedes dieser Zeichen zu einem echten UTF-8-String zurück zu bekommen, die Sie dann als normal dekodieren.

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

latin1 ist nur eine Abkürzung für Richies nuts'n'bolts Methode.

Es ist sehr merkwürdig, dass die stark unter beschrieben raw_unicode_escape Codec das gleiche Ergebnis wie latin1 in diesem Fall gibt. Haben sie immer das gleiche Ergebnis geben? Wenn ja, haben, warum ein solcher Codec? Wenn nicht, wäre es besser, sicher zu wissen, wie genau der Client-OP die Transformation von 'Rafa\xc5\x82' tat zu u'Rafa\xc5\x82' und dann genau diesen Prozess zu umkehren - sonst könnten wir pfuschen, wenn unterschiedliche Daten beschneiden, bevor die Doppelcodierung festgelegt ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top