如何确定CSV文件的编码?

How to determine the encoding of a CSV file?

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

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

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

UTF-16 编码的文本文件必须始终以 BOM 开头。 您可以使用此事实来检测它的存在。 UTF-16 有两种不同的 "flavors" – Big Endian (BE) 和 Low Endian (LE)。 由于 UTF-16 使用 two-byte 个字(16 位),因此有两种组合方式:high-byte 先(BE)或 low-byte 先(LE)。 您可以从 BOM 中看出,即。通过查看文件的 前两个字节

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

对于 UTF-8,严格来说并不需要 BOM——实际上,使用它实际上是 non-standard。 然而,许多 Windows 应用程序一直拒绝识别 UTF-8 编码,除非它包含 BOM,这一事实导致 pseudo-standard "UTF-8 with BOM"。 如果 BOM 存在,它会占用文件的 前三个字节

  • EF BB BF → UTF-8 带 BOM

如果您的文件以不同的开头,那么您要么使用 BOM-less UTF-8,要么使用某种 non-UTF 编码(ASCII、Latin-1...)。