如何确定CSV文件的编码?

时间:2019-02-11 17:45:28

标签: python encoding utf-8 utf-16 byte-order-mark

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

1 个答案:

答案 0 :(得分:1)

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

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

UTF-16编码的文本文件必须始终以BOM开头。 您可以使用此事实来检测其存在。 UTF-16有两种不同的“风味” –大端(BE)和低端(LE)。 由于UTF-16使用两字节字(16位),因此有两种编写方式:高字节优先(BE)或低字节优先(LE)。 您可以从BOM表得知,即。通过查看文件的前两个字节

  • FE FF→UTF-16 BE
  • FF FE→UTF-16 LE

对于UTF-8,并不是严格需要BOM,实际上,使用BOM实际上是非标准的。 但是,许多Windows应用程序一直不断拒绝识别UTF-8编码(除非它包含BOM表),这一事实导致了伪标准的“ UTF-8 with BOM”。 如果存在BOM,则它占据文件的前三个字节

  • EF BB BF→具有BOM表的UTF-8

如果文件以不同的开头,则说明您具有无BOM的UTF-8或某些非UTF编码(ASCII,Latin-1 ...)。