使用标准库json
模块似乎无法实现这一点。使用json.dumps
时,它将自动转义所有非ASCII字符,然后将字符串编码为ASCII。我可以指定它不会转义非ASCII字符,但是当它尝试将输出转换为ASCII时它会崩溃。
问题是 - 我不想要ASCII!我只想把我的JSON字符串作为 unicode (或 UTF-8 )字符串。有没有方便的方法呢?
这是一个展示我想要的例子:
d = {'navn': 'Åge', 'stilling': 'Lærling'}
json.dumps(d, output_encoding='utf8')
# => '{"stilling": "Lærling", "navn": "Åge"}'
但当然,没有 output_encoding 这样的选项,所以这是实际的输出:
d = {'navn': 'Åge', 'stilling': 'Lærling'}
json.dumps(d)
# => '{"stilling": "L\\u00e6rling", "navn": "\\u00c5ge"}'
总而言之 - 我希望将Python dict转换为 UTF-8 JSON字符串 而不会有任何转义。我怎么能这样做?
我会接受以下解决方案:
dumps
以达到预期效果)答案 0 :(得分:6)
encode_ascii=False
是恕我直言的最佳解决方案。
如果你使用的是Python2.7,这里是示例python文件:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# example.py
from __future__ import unicode_literals
from json import dumps as json_dumps
d = {'navn': 'Åge', 'stilling': 'Lærling'}
print json_dumps(d, ensure_ascii=False).encode('utf-8')
答案 1 :(得分:5)
确保您的python文件以UTF-8编码。否则,您的非ascii字符将成为问号?
。 Notepad ++具有出色的编码选项。
确保包含相应的字体。如果要显示日文字符,则需要安装日文字体。
确保您的IDE支持显示unicode字符。
否则,您可能会收到UnicodeEncodeError
错误。
示例:
UnicodeEncodeError: 'charmap' codec can't encode characters in position 22-23: character maps to <undefined>
PyScripter适合我。它包含在http://portablepython.com/wiki/PortablePython3.2.1.1
中的“Portable Python”中json.dumps()转义unicode字符。
阅读底部的更新。还是......
用解析的unicode字符替换每个转义字符。
我创建了一个名为getStringWithDecodedUnicode
的简单lambda函数,它就是这样做的。
import re
getStringWithDecodedUnicode = lambda str : re.sub( '\\\\u([\da-f]{4})', (lambda x : chr( int( x.group(1), 16 ) )), str )
这是getStringWithDecodedUnicode
作为常规功能。
def getStringWithDecodedUnicode( value ):
findUnicodeRE = re.compile( '\\\\u([\da-f]{4})' )
def getParsedUnicode(x):
return chr( int( x.group(1), 16 ) )
return findUnicodeRE.sub(getParsedUnicode, str( value ) )
import re
import json
getStringWithDecodedUnicode = lambda str : re.sub( '\\\\u([\da-f]{4})', (lambda x : chr( int( x.group(1), 16 ) )), str )
data = {"Japan":"日本"}
jsonString = json.dumps( data )
print( "json.dumps({0}) = {1}".format( data, jsonString ) )
jsonString = getStringWithDecodedUnicode( jsonString )
print( "Decoded Unicode: %s" % jsonString )
json.dumps({'Japan': '日本'}) = {"Japan": "\u65e5\u672c"}
Decoded Unicode: {"Japan": "日本"}
或者......只是传递ensure_ascii=False
作为json.dumps的选项。
注意:您需要满足我在开始时概述的要求,否则这不会起作用。
import json
data = {'navn': 'Åge', 'stilling': 'Lærling'}
result = json.dumps(d, ensure_ascii=False)
print( result ) # prints '{"stilling": "Lærling", "navn": "Åge"}'
答案 2 :(得分:0)
如果在 Python3.7 上这对我有用
from __future__ import unicode_literals
print json.dumps(m,ensure_ascii=False)
确保 from __future__ import unicode_literals
是要导入的第一行。