【问题标题】:A UnicodeDecodeError that occurs with json in python on Windows, but not Mac一个 UnicodeDecodeError 发生在 Windows 上的 python 中的 json 上,但不是 Mac
【发布时间】:2011-02-25 14:19:52
【问题描述】:

在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 和编解码器一起使用,但无济于事。

【问题讨论】:

    标签: python json serialization unicode


    【解决方案1】:

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

    您的一般问题是,在 Python pre-3 中,您不应输入包含非 ascii 内容的字节字符串("....",而不是 u"....")(除非专门作为转义字符串):this根据设置为默认编解码器的某些编解码器,可能(取决于会话的设置方式)直接失败或产生字节,这不是您期望的确切字节(因为您不知道使用中的确切默认编解码器)。使用明确的 Unicode 文字

    string = u"Don´t Forget To Breathe"
    

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

    【讨论】:

    • 嗯。有趣的是,这行得通。然而,在我正在使用的实际实现中(上面的代码只是一个孤立的例子),我真正想用 json 序列化的是一个由这个函数创建的对象:pastebin.com/e0CNAvCE遍历一个目录,找到所有MP3,并根据其元数据构建字典。自然会有一些特殊字符,但我认为我已经通过在元数据周围包装 unicode() 来处理这种可能性。有没有办法让我在这个函数中的 unicode() 方法与 u"" 示例不同?
    • @ventolin,不:unicode 调用本身应该在其参数包含非 Ascii 字符时立即失败(因为您没有指定编码,'ascii' 应该在那里使用) .我无法猜测他们是如何成功的,但是 json 序列化却失败了,尤其是。您报告的 decode 错误(可能是元数据的 ascii 但 文件路径 本身不是...?)
    猜你喜欢
    • 1970-01-01
    • 2018-04-18
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    • 2021-09-18
    • 2014-07-31
    • 1970-01-01
    • 2019-05-28
    相关资源
    最近更新 更多