如何从 UTF-8 文件中删除 BOM?

How can I remove the BOM from a UTF-8 file?

我有一个带 BOM 的 UTF-8 编码文件,我想删除 BOM。是否有任何 linux 命令行工具可以从文件中删除 BOM?

$ file test.xml
test.xml:  XML 1.0 document, UTF-8 Unicode (with BOM) text, with very long lines

如果您确定给定文件以 BOM 开头,则可以使用 tail 命令从文件中删除 BOM:

tail --bytes=+4 withBOM.txt > withoutBOM.txt

一个BOM是Unicode代码点U+FEFF; UTF-8 编码由三个十六进制值 0xEF、0xBB、0xBF 组成。

使用 bash,您可以创建具有 $'' 特殊引用形式的 UTF-8 BOM,它实现了 Unicode 转义:$'\uFEFF'。因此,对于 bash,从文本文件开头删除 UTF-8 BOM 的可靠方法是:

sed -i $'1s/^\uFEFF//' file.txt

如果文件不是以 UTF-8 BOM 开头,这将保持文件不变,否则将删除 BOM。

如果您使用其他 shell,您可能会发现 "$(printf '\ufeff')" 会生成 BOM 字符(适用于 zsh 以及任何 shell printf 内置,前提是 /usr/bin/printf 是 Gnu 版本),但是如果你想要一个 Posix 兼容的版本,你可以使用:

sed "$(printf '1s/^737//')" file.txt

-i 就地编辑标志也是 Gnu 扩展;此版本将可能修改的文件写入标准输出。)

使用VIM

  1. 打开 VIM 中的文件:

     vi text.xml
    
  2. 删除 BOM 编码:

     :set nobomb
    
  3. 保存并退出:

     :wq
    

对于非交互式解决方案,请尝试以下命令行:

vi -c ":set nobomb" -c ":wq" text.xml

应该从命令行删除 BOM、保存文件并退出。

好吧,今天刚刚处理这个问题,我的首选方式是 dos2unix:

dos2unix 将删除 BOM 并处理来自其他 SO 的其他特性:

$ sudo apt install dos2unix
$ dos2unix test.xml

也可以只删除 BOM (-r, --remove-bom):

$ dos2unix -r test.xml

注意: 使用 dos2unix 7.3.4

测试

Joshua Pinter 的回答在 mac 上正常工作,所以我编写了一个脚本,从给定文件夹中的所有文件中删除 BOM,请参阅 here

可以这样使用:

从当前目录中的所有文件中删除 BOM:rmbom .

打印当前目录下所有带BOM的文件:rmbom . -a

仅从当前目录中扩展名为 txt 或 cs 的所有文件中删除 BOM:rmbom . -e txt -e cs

如果您想处理大量文件,通过改进 Reginaldo Santos 的答案,有一个快速的方法:

find . -name "*.java" | grep java$ | xargs -n 1 dos2unix