在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,但无济于事。
答案 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"
你应该没事(或者如果你有任何问题,它会在这个作业时出现,此时我们可能会遇到“如何为我的交互式会话设置默认编码”的问题,如果这就是你所需要的。)