json和编码字符串

时间:2013-06-04 15:59:11

标签: python json encoding

我有这个字符串列表..

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"]

当我从文件中读取列表时,我得到正确的值。 但是这个文件也应该用户性地显示,我也期待..

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

或至少

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

2 个答案:

答案 0 :(得分:6)

执行json.dumps([u"čeština", u"maďarština", u"francouština"])时,您将获得字符串'["\\u010de\u0161tina", "ma\\u010far\u0161tina", "francou\\u0161tina"]'(使用有效的Python字符串文字形式)。 \u转义是如何在JSON中表示Unicode,并且Python的JSON模块将默认将所有非ascii字符转换为Unicode转义。您可以在ensure_ascii=False参数中使用json.dumps()来禁用此行为。

以下是一些示例,首先是默认行为:

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

使用ensure_ascii=False

>>> json.dumps(lst, ensure_ascii=False)
u'["\u010de\u0161tina", "ma\u010far\u0161tina", "francou\u0161tina"]'
>>> print json.dumps(lst, ensure_ascii=False)
["čeština", "maďarština", "francouština"]

现在为了确保使用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)

请注意,我还使用json.dump()直接写入文件而不是json.dumps()

答案 1 :(得分:4)

u"čeština无效JSON。据我所知,你不能在JSON字符串中有多字节字符(即它也无效),但我不能支持它。

["\u010de\u0161tina"]是有效的JSON。解析时,可以从\u部分解码UTF-8字符。为了安心起见,请打开浏览器控制台,键入"\u010de\u0161tina"并按 Enter 并查看打印的字符串。