在Django/Python中解码而非反转unicode编码
好的,我有一个硬编码的字符串,我是这样声明的:
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编码。
这到底是怎么回事呢?
2 个回答
1
参数名字错了?从文档上,我看到这个关键字参数的名字应该是encoding
,而不是coding
。
4
在你的源文件中,coding
这个头部告诉 Python 你的源代码使用什么编码。它是 Python 用来把 unicode 字符串字面量(比如 u"Par Catégorie"
)解码成 unicode 对象的编码。这个 unicode 对象本身没有编码,它就是原始的 unicode 数据。(在内部,Python 会根据配置使用两种编码中的一种,但作为编程者,你不需要担心这个。)
你遇到的 UnicodeDecodeError 错误意味着你在某个地方混合了 unicode 字符串和字节字符串(普通字符串)。当你把它们混在一起(比如拼接、格式化字符串等)时,Python 会尝试用默认编码(ASCII)把字节字符串转换成 unicode 字符串。如果字节字符串里有非 ASCII 的数据,这个转换就会失败,从而出现你看到的错误。这个操作可能是在某个库里进行的,但这仍然意味着你在混合不同类型的输入。
不幸的是,只要字节字符串里只有 ASCII 数据,这种错误就会频繁出现,即使是在库代码中。Python 3.x 通过消除 unicode 字符串(在 3.x 中就是 str
)和字节字符串(在 3.x 中是 bytes
类型)之间的隐式转换,解决了这个问题。