如何从 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
打开 VIM 中的文件:
vi text.xml
删除 BOM 编码:
:set nobomb
保存并退出:
: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
我有一个带 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
打开 VIM 中的文件:
vi text.xml
删除 BOM 编码:
:set nobomb
保存并退出:
: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