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

m13*_*13r 16 linux command-line byte-order-mark file utf-8

我有一个带有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
Run Code Online (Sandbox Code Playgroud)

ric*_*ici 22

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
Run Code Online (Sandbox Code Playgroud)

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

如果您正在使用其他shell,您可能会发现"$(printf '\ufeff')"生成BOM字符(与zsh没有printf内置的任何shell一起使用,只要/usr/bin/printf是Gnu版本),但是如果您想要与Posix兼容的版本,您可以使用:

sed "$(printf '1s/^\357\273\277//)" file.txt
Run Code Online (Sandbox Code Playgroud)

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


Jos*_*ter 15

使用VIM

  1. 在VIM中打开文件:

    vi text.xml
    
    Run Code Online (Sandbox Code Playgroud)
  2. 删除BOM编码:

    :set nobomb
    
    Run Code Online (Sandbox Code Playgroud)
  3. 保存并退出:

    :wq
    
    Run Code Online (Sandbox Code Playgroud)

  • 有没有办法让 vim 以非交互方式做到这一点?OP 要求提供“命令行”解决方案。 (2认同)

Reg*_*tos 13

好吧,今天刚解决了这个问题,我的首选方法是 dos2unix:

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

$ sudo apt install dos2unix
$ dos2unix test.xml
Run Code Online (Sandbox Code Playgroud)

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

$ dos2unix -r test.xml
Run Code Online (Sandbox Code Playgroud)

注意:用 dos2unix 7.3.4 测试


m13*_*13r 5

可以使用以下tail命令从文件中删除BOM :

tail --bytes=+4 withBOM.txt > withoutBOM.txt
Run Code Online (Sandbox Code Playgroud)

  • 只有当您*知道文件以UTF-8编码的BOM开头时,才应该这样做.作为一般性建议并不是一个好主意,因为如果文件不是以BOM开头,或者文件是UTF-16(或任何其他编码),这将破坏数据的前几个有意义的字符. (11认同)