UTF8 Python BOM

3
我有包含日文字符的Unicode字符串,想将它们写入CSV文件。然而,BOM似乎没有被正确写入,只是作为第一行中的字符串“”存在。这会导致Excel不能正确显示日文字符。在Notepad++中打开CSV时,字符会被正确显示。参考链接
fileObj = codecs.open(filename,"w",'utf-8')
fileObj.write(codecs.BOM_UTF8)
c = u';'
for s in stringsToWrite:
   line = e.someUnicodeString
   fileObj.write(line)
fileObj.close()

4
当错误地将BOM解释为Latin-1时,""就是BOM。你是如何检查结果的?此外,Excel在编码方面是臭名昭著的差劲。 - deceze
对我来说解决了问题。 - AntiqueZamba
3
UTF-8的BOM不是一直被反对吗? - InternetSeriousBusiness
1
@InternetSeriousBusiness 嗯,我确实不赞成这样做,但微软不听我的。 - Adrian Ratnapala
Excel真是个麻烦事。你说得对,确实需要指定BOM,但是默认情况下,Excel会使用机器的默认编码加载文件(几乎肯定不是utf8)。你必须导入它并手动选择正确的编码UTF8,并放置BOM。 - Matthew Wilcoxson
2个回答

8
fileObj = codecs.open(filename,"w",'utf-8')

好的,你拥有一个Unicode输出流。

fileObj.write(codecs.BOM_UTF8)

BOM_UTF8 是一组字节,而不是您期望写入 Unicode 流的 Unicode 字符串。Python 会自动使用某些编码从字节转换为 Unicode,但这可能不是正确的编码方式。如果默认编码是 Windows 代码页 1252 而不是 UTF-8,则将有效地对 BOM 进行双重编码,并作为  的 UTF-8 编码显示。

建议将 BOM 写成其所代表的 Unicode 字符:

fileObj.write(u'\uFEFF')

InternetSeriousBusiness 写道:

UTF-8 BOM 不是被反对了吗? –

是的,在大多数情况下,UTF-8 伪 BOM 是一个灾难,但它需要用于使 Excel 的字符集猜测选中 UTF-8。不幸的是,在 Excel for Mac 中无法使用此方法。另一个可能的方法是使用 UTF-16。


0

你复制的字符串UTF-8 BOM。所以你的问题不在你的Python代码中,而是在其他地方。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接