【问题标题】:How to determine the encoding of a CSV file?如何确定 CSV 文件的编码?
【发布时间】:2019-07-05 06:47:37
【问题描述】:

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

【问题讨论】:

  • 听起来可能是不可能的——见How to determine the encoding of text?
  • UTF-16 并不多用于交换数据。尝试使用编辑器(或浏览器)并检查不同的编码:当您看到好的数据时,它可能是正确的编码。如果您看到许多 00 字节,则几乎可以肯定是 UTF-16(或其他 16 位或更多位编码)。 [一个csv文件需要有逗号,所以U+002C,所以在这种情况下你必须有00字节]
  • 告诉发件人您只接受 UTF-8(或其他)可能更直接。或者接受字符编码不与文件分离的文件格式,例如 .xlsx。

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


【解决方案1】:

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

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

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

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

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

  • EF BB BF → UTF-8 和 BOM

如果您的文件以不同的开头,那么您要么有无 BOM 的 UTF-8,要么有一些非 UTF 编码(ASCII、Latin-1...)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    • 2014-07-28
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多