簡體   English   中英

Python 編碼和 json 轉儲

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM