2

好的,我有一个这样声明的硬编码字符串

name = u"Par Catégorie"

我有一个 # - - coding: utf-8 - - 魔术头,所以我猜它已转换为 utf-8

在路上它通过输出到 xml

xml_output.toprettyxml(indent='....', encoding='utf-8')

我得到一个

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 3: ordinal not in range(128)

我的大部分数据都是法文的,并且在 CDATA 节点中正确输出,但是一个硬编码的字符串保留了……我不明白为什么要调用 ascii 编解码器。

怎么了 ?

4

2 回答 2

4

源文件中的coding标头告诉 Python 你的是什么编码。它是 Python 用来将 unicode 字符串文字 ( u"Par Catégorie") 的源解码为 un​​icode 对象的编码。unicode 对象本身没有编码;它是原始的 unicode 数据。(在内部,Python 将使用两种编码之一,具体取决于它的配置方式,但 Python 代码不应该担心这一点。)

您得到的 UnicodeDecodeError 意味着在某处,您正在混合 unicode 字符串和字节串(普通字符串)。当将它们混合在一起(连接、执行字符串插值等)时,Python 将尝试通过使用解码字节串将字节串转换为 unicode 字符串默认编码,ASCII。如果字节串包含非 ASCII 数据,这将失败并出现您看到的错误。正在完成的操作可能在某个库中,但这仍然意味着您正在混合不同类型的输入。

不幸的是,只要字节串只包含 ASCII 数据,它就可以正常工作,这意味着即使在库代码中,这种类型的错误也太频繁了。Python 3.x 通过摆脱 unicode 字符串(仅str在 3.x 中)和字节字符串(在 3.x 中的bytes类型)之间的隐式转换解决了这个问题。

于 2010-04-12T21:41:28.427 回答
1

参数名称错误?从文档中,我可以看到关键字参数名称应该是encoding而不是coding

于 2010-04-12T20:54:56.913 回答