Python3中的json.dumps,会将中⽂转换为unicode编码后保
先把这次踩坑的结论放在最前⾯
1. Python 3已经将unicode作为默认编码
2. Python 3中的json在做dumps操作时,会将中⽂转换成unicode编码,并以16进制⽅式存储,再做逆向操作时,会将unicode编码转换回中⽂
这就解释了,为什么json.dumps操作后,得到的字符串是\uXXXX。
谢谢@benpaodexiaowoniu。
在python3中,ensure_ascii=False就解决了问题
------------------分割线以下部分纯属扯淡,没时间的现在可以关闭页⾯了-------------------------
如果不知道上⾯两点,加之python之前对编码处理的不好名声,就会陷⼊⼀个问题深坑中。
读到这⾥,如果你赶时间,就可以不⽤往下看了。
爆出问题的代码如下:
@ute("/<desc>/<amount>")
def addSimpleRecord(desc, amount):
.....
file.write(json.dumps(buildJson(desc, amount)));
....
整个程序运⾏正常,但当我打开⽂件看到保存的中⽂数据变成了\uXXXX时,头都⼤了。
经过了各种尝试,我发现⽹上对python3中的编码问题进⾏了如下归纳
1. \uXXXX是unicode 16进制编码的表现形式
2. 在⽂件的第⼀⾏加上# -*- coding: utf-8 -*-
3. 对字符串对象进⾏str.decode('...').encode('...')
4. 对字符串对象进⾏操作:de('utf-8').decode('unicode_escape')
关于第⼀条,print("你" == "\u4f60")得到的结果是True
关于第⼆条,那是python2的故事,在python3中默认的⽂件编码就是utf-8。因此,在保存python 3的脚本时,请务必保存为utf-8。
关于第三条,那也是python2的故事,在python3中,字符串默认采⽤unicode编码。
关于第四条,最初我是参考 ,发现不能重现,后来当我⽤\\uXXXX时,就重现了这篇⽂章中描述的问题,因为\在python字符串中起转义作⽤(我居然给忘记了)。
为什么json.dumps处理过后的中⽂就变成了\uXXXX呢?原因在这⾥
ESCAPE_ASCII = repile(r'([\\"]|[^\ -~])')
HAS_UTF8 = repile(b'[\x80-\xff]')
ESCAPE_DCT = {
'\\': '\\\\',
'"': '\\"',
'\b': '\\b',
'\f': '\\f',
'\n': '\\n',
'\r': '\\r',
'\t': '\\t',
}
def py_encode_basestring_ascii(s):
中文字符unicode查询"""Return an ASCII-only JSON representation of a Python string
"""
def replace(match):
s = up(0)
try:
return ESCAPE_DCT[s]
except KeyError:
n = ord(s)
if n < 0x10000:
return '\\u{0:04x}'.format(n)
#return '\\u%04x' % (n,)
else:
# surrogate pair
n -= 0x10000
s1 = 0xd800 | ((n >> 10) & 0x3ff)
s2 = 0xdc00 | (n & 0x3ff)
return '\\u{0:04x}\\u{1:04x}'.format(s1, s2)
return '"' + ESCAPE_ASCII.sub(replace, s) + '"'
关键的地⽅就在:
return '\\u{0:04x}'.format(n)
其中{0:04x}表⽰取第⼀个参数,并取长度为4的16进制⼩写数字。
json.dumps的参数中有⼀个参数ensure_ascii,其默认值为True。我想这么做的⽬的可能是为了跨平台的通⽤性。到此为⽌,python 3的编码问题总算是告⼀段落,如有问题,欢迎交流。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。