2016-07-27 10 views
0

auf UTF8 flüchtete ich aus dieser old discussion kam, aber die Lösung nicht viel helfen, wie mein Original-Daten unterschiedlich codiert wurde:json.dumps u Unicode

Meine ursprünglichen Daten bereits in Unicode codiert wurde, muss ich Ausgabe als UTF-8

data={"content":u"\u4f60\u597d"}

Wenn ich versuche zu utf zu konvertieren:

json.dumps(data, indent=1, ensure_ascii=False).encode("utf8")

der Ausgang I erhalten ist "content": "ä½ å¥½" und die Put sollte erwartet aus "content": "你好"

Ich habe versucht, ohne ensure_ascii=false und der Ausgang wird seine Ebene unescaped "content": "\u4f60\u597d"

Wie kann ich das vorher \ u entkam json in UTF-8 konvertieren ?

+1

Sie lesen Ihre UTF-8-Daten im falschen Codec. Sie ** haben ** UTF-8, aber entschlüsseln es als Latin-1 oder CP1252. Mit anderen Worten, das ist kein Python-Problem. –

+0

Ja, ich konnte dieses Problem in Python 3 REPL nicht darstellen. –

Antwort

5

Sie UTF-8 JSON Daten haben:

>>> import json 
>>> data = {'content': u'\u4f60\u597d'} 
>>> json.dumps(data, indent=1, ensure_ascii=False) 
u'{\n "content": "\u4f60\u597d"\n}' 
>>> json.dumps(data, indent=1, ensure_ascii=False).encode('utf8') 
'{\n "content": "\xe4\xbd\xa0\xe5\xa5\xbd"\n}' 
>>> print json.dumps(data, indent=1, ensure_ascii=False).encode('utf8') 
{ 
"content": "你好" 
} 

My Terminal nur geschieht konfiguriert werden UTF-8, zu handhaben, um das Drucken der UTF-8-Bytes zu meinem Terminal erzeugt die gewünschte Ausgangs .

Allerdings, wenn Ihr Terminal ist nicht für eine solche Ausgabe eingestellt, es ist Ihr Terminal, dass dann ‚falsch‘ Zeichen zeigt:

>>> print json.dumps(data, indent=1, ensure_ascii=False).encode('utf8').decode('latin1') 
{ 
"content": "你好" 
} 

Hinweis, wie ich die Daten auf Latein decodiert -1, um die UTF-8-Bytes absichtlich falsch zu lesen.

Dies ist kein Python-Problem; Dies ist ein Problem damit, wie Sie die UTF-8-Bytes in welchem ​​Werkzeug zum Lesen dieser Bytes handhaben.

+0

Danke, es war mein Browser, der agiert. Ich dachte, dass der 'Ľ å ¥ ½' Kodierungsfehler am Ende von Python war. Stellt sich heraus, es ist die Ausgabe :) – Bonk

+1

@Bonk: Vielleicht müssen Sie einen richtigen Antwort-Header festlegen? 'Content-Type: application/json' sollte ausreichen (da der JSON-Standard angibt, dass UTF der Standard ist, mit einer BOM am Anfang, die es ermöglicht, UTF-8 von UTF-16 und UTF-32 zu unterscheiden) oder include der Zeichensatz explizit mit 'Content-Type: application/json; charset = utf8'. Ohne einen 'Content-Type'-Header oder mit einem auf einen' text/.. 'gesetzten MIME-Typ kann der Browser durchaus auf Latin-1 zurückgreifen. –

Verwandte Themen