2013-06-04 175 views
1

我有一個字符串這個名單..JSON和編碼字符串

mylist = [u"čeština", u"maďarština", u"francouština"] 

我需要把它轉儲到一個文件中,我使用JSON爲

text = json.dumps(mylist) 
FILE = open("file.txt", 'w') 
FILE.write(text) 
FILE.close() 

但是當我打開文件在編輯器(使用UTF-8)我看

["\u010de\u0161tina", "ma\u010far\u0161tina", "francou\u0161tina"] 

當我從文件中讀取列表,我得到正確的值。 但也應顯示該文件的用戶friedly,也是我期待..

["čeština", "maďarština", "francouština"] 

或至少

[u"čeština", u"maďarština", u"francouština"] 
+1

不要使用'list'作爲變量名稱,因爲它是python中的保留關鍵字。 –

+0

也許你應該考慮使用yaml – oleg

+0

編輯:列表 - > mylist – Meloun

回答

6

當你做json.dumps([u"čeština", u"maďarština", u"francouština"])你會得到字符串'["\\u010de\u0161tina", "ma\\u010far\u0161tina", "francou\\u0161tina"]'(使用有效的Python字符串文字形式)。 \u轉義是Unicode在JSON中的表示方式,Python的JSON模塊默認將所有非ASCII字符轉換爲Unicode轉義。您可以通過在json.dumps()參數中使用ensure_ascii=False來禁用此行爲。

這裏有幾個例子,第一默認行爲:

>>> json.dumps(lst) 
'["\\u010de\\u0161tina", "ma\\u010far\\u0161tina", "francou\\u0161tina"]' 
>>> print json.dumps(lst) 
["\u010de\u0161tina", "ma\u010far\u0161tina", "francou\u0161tina"] 

而且隨着ensure_ascii=False

現在,以確保您使用的是UTF-8則可以用寫這個Unicode字符串codecs模塊:

import codecs, json 
lst = [u"čeština", u"maďarština", u"francouština"] 
json.dump(lst, codecs.open('file.txt', 'w', 'utf-8'), ensure_ascii=False) 

請注意,I也使用json.dump(),它直接寫入文件而不是json.dumps()

+0

+1爲全面的例子。 –

+0

真的很好的答案!謝謝。 – Meloun

4

u"čeština不是有效的JSON。據我所知,你不能在JSON字符串中使用多字節字符(即它也是無效的),但是我不能支持它。

["\u010de\u0161tina"]是有效的JSON。在解析時,UTF-8字符可以從\u部分解碼。爲了一些安心,打開瀏覽器控制檯,鍵入"\u010de\u0161tina"並點擊輸入並查看打印的字符串。