python - 如何确定 CSV 文件的编码?

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

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

最佳答案

注意:一般来说,识别文本文件的原始编码不是一个确定性问题。如果没有元数据(例如 HTML 内容类型 header ),您只能猜测。有一些工具和库可以帮助您猜测 - 其中一些做得非常好 - 但您不能 100% 确定。如果涉及 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 并不是严格需要的——事实上,使用它实际上是非标准的。 然而,许多 Windows 应用程序不断拒绝识别 UTF-8 编码,除非它包含 BOM,这一事实导致了伪标准“UTF-8 with BOM”。 如果 BOM 存在,则它占据文件的前三个字节:

  • EF BB BF → 带 BOM 的 UTF-8

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

关于python - 如何确定 CSV 文件的编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54636245/

相关文章:

java - 保留/读取 ZIP 中的 xml 内容,保持正确的编码

windows - 如何在 Perl 中线程安全地设置 STDOUT 编码?

java - 将资源包读取为 UTF-8。 getString() 方法似乎将编码更改为 ISO-8859

python - Python 缓存字节码 (pyc) 文件何时更新?

python - 获取递归错误: maximum recursion depth exceeded in comparison

python - 将标签放置在 matplotlib 中的自定义位置

encoding - 如何在 NodeJS 中对字符集编码进行编码/解码?

python - 从图形中删除轴

list - 存储多重集/无序列表的节省空间的方法

java - 在 Java 中编码可变长度的 utf8 字节数组