下面的代码(Python 3.6)采用一个字节对象,表示UTF-8中的multiplication sign(b'\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 的十六进制表示形式打印到屏幕上,但事实证明它不是表现为预期。由于这使得事情变得不必要地混淆(函数对于问题也不是必不可少的)我从代码中删除了它。