如何检查 UTF-8 文本文件是否有 BOM?

如何检查 UTF-8 文本文件是否有 BOM?

如何检查 UTF-8 文本文件是否有物料清单从命令行?

file命令显示:

UTF-8 Unicode text

但是,我不知道这是否意味着文件中没有 BOM。

我使用的是 Ubuntu 12.04。

答案1

file会告诉你是否有物料清单。您可以简单地测试它:

printf '\ufeff...\n' | file -
/dev/stdin: UTF-8 Unicode (with BOM) text

某些 shell(例如ash或 )dash具有printf不支持的内置命令\u,在这种情况下您需要使用printfGNU coreutils,例如/usr/bin/printf


注意:根据file更新日志,此功能在 2007 年就已存在。因此,这应该适用于当前的任何计算机。

答案2

如果你执行stat fileName它应该会给你准确的三个字符。当我在编辑器中打开文件时,我看不到任何内容。因此,注意到文件大小为 3 让我清楚地知道它有 BOM。

另外,帖子这里对我来说很有帮助。

hexdump -n 3 -C 2.txt
00000000 ef bb bf
ef bb bf // YES

答案3

另一种变体—— dos2unix

$ dos2unix -ib   *.txt
  no-bom f1.txt                 # this file has no BOM
  utf-8  f2.txt                 # this file has BOM + UTF-8
 

此命令具有更改文件格式的选项,例如添加或删除 BOM

答案4

带有 BOM 的 UTF-8 文件以 3 个字节 0xef 0xbb 0xbf 开头,即 U+FEFF 字符的 UTF-8 编码。

您可以通过读取文件的前 3 个字节在 bash 中有效地找到这些文件:

find . -type f -size +2c -print0 |
  while IFS= read -rd '' file; do
    IFS= LC_ALL=C read -rd '' -n3 first3 < "$file" &&
      [[ $first3 = $'\xef\xbb\xbf' ]] &&
      printf '%s\n' "$file"
  done

它不会检查文件的其余部分是否是有效的 UTF-8,但也不会file,这只是一种启发式方法。

相关内容