Python 如何确定CSV文件的编码?

Python 如何确定CSV文件的编码?,python,encoding,utf-8,utf-16,byte-order-mark,Python,Encoding,Utf 8,Utf 16,Byte Order Mark,我正在编写脚本,该脚本必须对CSV文件进行一些操作,但我不知道该文件是用utf-8还是utf-16编码的。如何检查给定的csv文件是否包含utf-16 BOM?注意:一般来说,识别文本文件的原始编码不是一个确定的问题。如果没有元数据(例如HTML内容类型标题),您只能猜测。有一些工具和库可以帮助你猜测——其中一些做得很好——但你不能100%确定。如果涉及8位编码(如Latin-1、Windows CP1252等),则尤其如此 但是如果您已经知道编码必须是UTF-8或UTF-16,那么您的情况就很

我正在编写脚本,该脚本必须对CSV文件进行一些操作,但我不知道该文件是用utf-8还是utf-16编码的。如何检查给定的csv文件是否包含utf-16 BOM?

注意:一般来说,识别文本文件的原始编码不是一个确定的问题。如果没有元数据(例如HTML内容类型标题),您只能猜测。有一些工具和库可以帮助你猜测——其中一些做得很好——但你不能100%确定。如果涉及8位编码(如Latin-1、Windows CP1252等),则尤其如此

但是如果您已经知道编码必须是UTF-8或UTF-16,那么您的情况就很好了

UTF-16编码的文本文件必须始终以开头。 您可以使用此事实来检测它的存在。 UTF-16有两种不同的“口味”——大端(BE)和低端(LE)。 由于UTF-16使用双字节字(16位),所以有两种方法来组合它们:高字节优先(BE)或低字节优先(LE)。 您可以从BOM表中判断,即通过查看文件的前两个字节来判断:

  • FE FF
    → UTF-16 BE
  • FF FE
    → UTF-16LE
对于UTF-8,BOM并不是严格需要的——事实上,使用它实际上是非标准的。 然而,许多Windows应用程序一直拒绝识别UTF-8编码,除非它包含BOM,这一事实导致了伪标准“带BOM的UTF-8”。 如果BOM表存在,它将占用文件的前三个字节:

  • EF BB BF
    → 带BOM的UTF-8

如果您的文件以不同的开头,那么您要么使用无BOM的UTF-8,要么使用一些非UTF编码(ASCII、拉丁语-1…。

听起来可能不可能-请参阅UTF-16不太用于交换数据。尝试使用编辑器(或浏览器)并检查不同的编码:当您看到良好的数据时,可能是正确的编码。如果看到很多00字节,几乎可以肯定是UTF-16(或其他16位或更多位编码)。[一个csv文件需要有一个逗号,所以U+002C,所以在这种情况下,你必须有00字节]告诉发送者你只接受UTF-8(或其他)可能更简单。或者接受字符编码未与文件分离的文件格式,如.xlsx。