[英]Python encoding and json dumps
如果之前有人問過這個問題,我深表歉意。 我仍然不清楚python3.2中的編碼。
我正在閱讀 csv(以 UTF-8 編碼,無 BOM),並且我在 csv 中有法語口音。
這是打開和讀取 csv 文件的代碼:
csvfile = open(in_file, 'r', encoding='utf-8')
fieldnames = ("id","locale","message")
reader = csv.DictReader(csvfile,fieldnames,escapechar="\\")
for row in reader:
if row['id'] == id and row['locale'] == locale:
out = row['message'];
我將消息(輸出)作為 Json 返回
jsonout = json.dumps(out, ensure_ascii=True)
return HttpResponse(jsonout,content_type="application/json; encoding=utf-8")
但是,當我預覽結果時,重音 e(French) 被替換為 \é 。
你能告訴我我做錯了什么,我應該怎么做,以便 json 輸出顯示帶有口音的正確 e。
謝謝
您沒有做錯任何事(Python 也沒有做錯)。
Python 的 json 模塊只是采用安全路徑並轉義非 ascii 字符。 這是在 json 中表示此類字符的有效方式,任何符合標准的解析器在解析字符串時都會重新生成正確的 Unicode 字符:
>>> import json
>>> json.dumps({'Crêpes': 5})
'{"Cr\\u00eapes": 5}'
>>> json.loads('{"Cr\\u00eapes": 5}')
{'Crêpes': 5}
不要忘記 json 只是您數據的表示,而"ê"
和"\\\ê"
都是字符串ê
有效 json 表示。 符合 json 解析器應該正確處理兩者。
不過,可以禁用此行為,請參閱json.dump
文檔:
>>> json.dumps({'Crêpes': 5}, ensure_ascii=False)
'{"Crêpes": 5}'
關於此答案,設置ensure_ascii=False
會在您的打印輸出中呈現特殊字符。 另一方面, marcelm 的答案仍然是正確的,因為在這些編碼中沒有丟失任何信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.