2016-07-08 9 views
0

Ich habe einen Wert wie u '\ U00000958' zurückgegeben von einer Datenbank und ich möchte diese Zeichenfolge in utf8 konvertieren. Ich versuche, so etwas wie dieses:konvertieren Unicode Ucs4 in UTF8

cp = u'\\U00000958' 
value = cp.decode('unicode-escape').encode('utf-8') 
print 'Value: " + value 

ich diesen Fehler:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe0 in position 0: ordinal not in range(128)

Was kann ich tun, um richtig diesen Wert zu konvertieren?

Mehr Details. Ich bin in 2.7.10, die Ucs2 verwendet.

+0

Ist 'cp = u '\\ U00000958''? Vielleicht könntest du 'unicode (' utf-8 ', cp.decode (' unicode-escape ')) versuchen 'Dein Code funktioniert seltsamerweise für mich und ich bekomme' Wert: '\ xe0 \ xa5 \ x98'' –

+0

entschlüsselt = Unicode ('utf-8', cp.decode ('Unicode-Escape')) bekommt mich den gleichen Fehler – Keith

+0

Siehe mehr Details oben: @PeterWang – Keith

Antwort

0

Bei Unicode-Problemen hilft es oft, Python 2 gegenüber Python 3 zu spezifizieren, und auch, wie man kam, um eine bestimmte Darstellung zu erhalten.

Aus dem ersten Satz ist nicht ersichtlich, was der tatsächliche Wert ist, im Gegensatz zur Darstellung. Es ist unklar, ob die value like u'\\U00000958' eine Unicode-Zeichenfolge mit 1 Zeichen, eine Unicode-Zeichenfolge mit 10 Zeichen, eine Zeichenfolge mit 14 Zeichen (Ascii) oder etwas anderes ist. Verwendung von len und type kann verwendet werden, um sicher zu sein, was Sie haben.

Mit dem Versuch, cp zu dekodieren, implizieren Sie, dass Sie wissen, dass cp Byte ist, aber welche Codierung? Die Fehlermeldung besagt, dass es sich nicht um ASCII-Bytes handelt. 0xe0 ist ein typisches Startbyte für die utf-8-Codierung. Die folgende Interaktion

>>> s = "u'\\U00000958'" 
>>> se = eval(s) 
>>> se 
u'\u0958' 
>>> se.encode(encoding='utf-8') 
'\xe0\xa5\x98' 
>>> 

mir legt nahe, dass cp, mit \ xe0 beginnend 3 UTF-8-codierten Bytes und dass u'\\U00000958' eine auswertbare Darstellung seiner Unicode-Decodierung.

+0

Die Version wurde schnell zu der Frage hinzugefügt, bevor diese Antwort gesendet wurde. Vielleicht Timing-Problem. Also 2,7 mit ucs2. Ich teste die Unicode-Unterstützung, und der Wert wird als \ U00000958 in der Datenbank gespeichert, ABER wird als u \\ U00000958 zurückgegeben. Der erste Teil entfernt also die Flucht. Das eigentliche Zeichen ist auch in der DB gespeichert und ich versuche, die \ U-Version zu einem UTF-8 zum Vergleich zu konvertieren. Es ist in diesem Format, da Python 2.7 andere Probleme hat. Welche zu lange hier zu posten sind. Dieses Format wurde in einem anderen Beitrag vorgeschlagen. – Keith

+0

Auch cp in meinem Codebeispiel ist nicht in Anführungszeichen eingeschlossen. Angenommen, ich ziehe den Wert aus einem Wörterbuch oder habe ihn ohne doppelte Anführungszeichen codiert. – Keith