在Python中加载JSON作为标题字符集
我一直觉得字符集和编码很难理解,这次又遇到了一个新问题。对可能出现的不准确之处我表示歉意,我会尽量做到最好。
我正在从一个服务器请求数据,服务器返回的是JSON格式的数据。在HTTP头信息中,它还返回了字符集,像这样:
Content-Type: text/html; charset=UTF-8
我在用Python的JSON库,通过json.loads
方法来加载这个JSON。当我把返回的JSON传给它时,它给我返回了一个Unicode格式的字典。我查了一下,知道JSON应该返回Unicode,因为JavaScript的字符串就是Unicode对象。我想知道怎么才能把JSON加载为UTF-8格式?我希望使用和响应头中指定的编码一样的格式。
我看过这篇帖子,但没有帮助。
谢谢。
2 个回答
JSON文本必须使用Unicode编码。默认的编码方式是UTF-8。
因为JSON文本的前两个字符总是ASCII字符,所以我们可以通过查看前四个字节中的空字节模式,来判断这个字节流是UTF-8、UTF-16(大端或小端)还是UTF-32(大端或小端)。
00 00 00 xx UTF-32BE 00 xx 00 xx UTF-16BE xx 00 00 00 UTF-32LE xx 00 xx 00 UTF-16LE xx xx xx xx UTF-8
所以,如果你有一个以字节串形式存在的JSON文本,总是可以把它转换成Unicode字符串。而一旦你得到了Unicode字符串,如果需要的话,你可以用任何你喜欢的编码方式把它再转换成字节串。
json.loads()
这个函数会使用指定的编码(默认是'utf-8'
)。如果输入的编码不是基于ASCII的,那么在把文本传给json.loads()
之前,应该手动把它转换成Unicode。
json.loads
这个函数会自动处理传给它的 UTF-8 格式的字符串,所以在这种情况下,你不需要自己担心字符编码的问题。loads
已经帮你把 UTF-8 转换成了 Python 使用的 UCS-2 Unicode 格式。
除非你有其他特别的原因需要直接操作原始的 UTF-8,否则你可以放心使用,即使你传入的是 str
类型,返回的却是 unicode
类型。如果你想确保输入的编码格式,或者在处理不同的字符编码时,你也可以把输入编码作为 loads
的第二个参数来指定。