2016-07-27 147 views
0

我從這個old discussion來了,但解決方案並沒有多大幫助我的原始數據進行編碼的不同:json.dumps帶有 U轉義的unicode爲utf8

我的原始數據是採用Unicode已編碼,我需要作爲輸出UTF-8

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

當我嘗試轉換爲UTF:

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

輸出我得到的是 "content": "ä½ å¥½"和預期的出放應 "content": "你好"

我嘗試沒有ensure_ascii=false和輸出變爲純轉義"content": "\u4f60\u597d"

我如何轉換之前帶有\ U轉義的JSON爲UTF-8 ?

+1

您正在讀取錯誤編解碼器中的UTF-8數據。您**擁有** UTF-8,但將其解碼爲Latin-1或CP1252。換句話說,這不是一個Python問題。 –

+0

是的,我無法在Python 3 REPL中指出這個問題。 –

回答

5

UTF-8 JSON數據:

>>> 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": "你好" 
} 

我的終端只是發生到被配置爲處理UTF-8,所以打印UTF-8字節到我的終端產生的期望的輸出。

但是,如果你的終端是設立這樣的輸出,它是你的終端那則顯示「錯誤」的字符:

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

注意我如何解碼的數據拉丁-1故意誤讀UTF-8字節。

這不是Python問題;這是您在處理UTF-8字節時所遇到的一個問題,無論您用什麼工具讀取這些字節。

+0

謝謝,這是我的瀏覽器,正在表演。我認爲'½½'''在Python端是編碼錯誤。原來這是輸出:) – Bonk

+1

@Bonk:也許你需要設置一個正確的響應頭? 'Content-Type:application/json'應該足夠了(因爲JSON標準規定UTF是默認的,在開始時使用BOM可以將UTF-8與UTF-16和UTF-32區分開來),或者包括這個字符集明確地用'Content-Type:application/json;字符集= utf8'。如果沒有「Content-Type」頭或一個設置爲「text/..」MIME類型,瀏覽器可能會默認爲Latin-1。 –