解码字节对象会导致意外+无效的UTF-8 - 我该如何避免这种情况?

时间:2017-04-06 13:04:35

标签: python python-3.x unicode

下面的代码(Python 3.6)采用一个字节对象,表示UTF-8中的multiplication signb'\xc3\x97'),将其解码为字符串,并将字符串写入文件:

# Byte sequence corresponds to multiplication sign in UTF-8
myBytes = b'\xc3\x97'
# Decode to string 
myString = myBytes.decode('utf-8')

# Write myString to file
with open("myString.txt", "w") as ms_file:
    ms_file.write(myString)

这给了我以下结果:

写入 myString.txt 的字节(通过在十六进制编辑器中打开文件进行检查):D7

我期望的结果是2字节序列C3 97,它是乘法符号的UTF-8表示。此外,D7甚至不是有效(一个字节)的UTF-8序列(另请参阅UTF-8 Codepage Layout)。它匹配ISO/IEC 8859-1 (Latin)编码的字节值。

所以我的问题就是如何确保我最终获得有效的UTF-8。我是否忽视了一些非常明显的东西,或者这是Python中的一个错误?

某些上下文:我在编写处理XML文件(使用UTF-8)的代码时遇到了这个问题,使用lxml将XML解析为Element对象,提取了一些元素的文本值,这些元素随后被写入另一个XML文件(也使用UTF-8)。由于这个问题,我现在最终可能得到格式不正确的XML文件。

我在Windows 7下使用Python 3.6。

编辑:原始问题/代码包含一个函数,该函数应该将 myString 的十六进制表示形式打印到屏幕上,但事实证明它不是表现为预期。由于这使得事情变得不必要地混淆(函数对于问题也不是必不可少的)我从代码中删除了它。

0 个答案:

没有答案