在Windows上使用Python的json时出现UnicodeDecodeError,但在Mac上没有
在Windows上,我遇到了以下问题:
>>> string = "Don´t Forget To Breathe"
>>> import json,os,codecs
>>> f = codecs.open("C:\\temp.txt","w","UTF-8")
>>> json.dump(string,f)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python26\lib\json\__init__.py", line 180, in dump
for chunk in iterable:
File "C:\Python26\lib\json\encoder.py", line 294, in _iterencode
yield encoder(o)
UnicodeDecodeError: 'utf8' codec can't decode bytes in position 3-5: invalid data
(注意字符串中的非ASCII单引号。)
然而,我的朋友在他的Mac上(也使用python2.6),可以轻松运行这个:
> string = "Don´t Forget To Breathe"
> import json,os,codecs
> f = codecs.open("/tmp/temp.txt","w","UTF-8")
> json.dump(string,f)
> f.close(); open('/tmp/temp.txt').read()
'"Don\\u00b4t Forget To Breathe"'
这是为什么呢?我也尝试过用UTF-16和UTF-32来处理json和编码,但都没有成功。
1 个回答
2
在每台机器上,repr(string)
会显示什么呢?在我的Mac上,撇号显示为\xc2\xb4
(这是utf8编码,占用2个字节),所以utf8编码可以处理这个问题;而在你的Windows上,显然不是这样,因为它提到“三个”字节的问题——所以在Windows上,你的控制台可能设置了其他非utf8的编码。
你面临的主要问题是,在Python 3之前,你不应该输入包含非ascii内容的字节字符串(你用的"...."
,而不是u"...."
),除非是特意作为转义字符串输入:这可能会(取决于会话的设置)直接失败,或者根据某种默认的编码产生字节,这些字节可能不是你预期的那样(因为你不知道正在使用的确切默认编码)。所以,使用明确的Unicode字面量
string = u"Don´t Forget To Breathe"
应该就没问题了(或者如果你有任何问题,它会在这个赋值时显现出来,到时候我们可以讨论“如何为我的交互式会话设置默认编码”,如果你需要的话)。