与Windows上的python中的json一起出现的UnicodeDecodeError,但不是Mac

时间:2010-05-30 00:35:44

标签: python json serialization unicode

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

这是为什么?我也尝试过使用带有json和编解码器的UTF-16和UTF-32,但无济于事。

1 个答案:

答案 0 :(得分:2)

repr(string)在每台机器上显示什么?在我的Mac上,撇号显示为\xc2\xb4(utf8编码,2个字节),因此当然utf8编解码器可以处理它;在你的Windows上它显然没有这样做,因为它谈论三个字节是一个问题 - 所以在Windows上你必须为你的控制台设置一些其他非utf8编码。

您的一般问题是,在Python 3之前的版本中,您不应该使用非ascii内容输入字节字符串("....",而不是u"....")(除非特别作为转义字符串):这可能(取决于会话的设置方式)直接失败或产生字节,根据一些编解码器设置为默认值,这不是你期望的确切字节(因为你不知道确切的默认编解码器正在使用)。使用显式Unicode文字

string = u"Don´t Forget To Breathe"

你应该没事(或者如果你有任何问题,它会在这个作业时出现,此时我们可能会遇到“如何为我的交互式会话设置默认编码”的问题,如果这就是你所需要的。)