在Windows上使用Python的json时出现UnicodeDecodeError,但在Mac上没有

2 投票
1 回答
1245 浏览
提问于 2025-04-15 23:20

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

应该就没问题了(或者如果你有任何问题,它会在这个赋值时显现出来,到时候我们可以讨论“如何为我的交互式会话设置默认编码”,如果你需要的话)。

撰写回答