【问题标题】:How can I remove the BOM from a UTF-8 file? [duplicate]如何从 UTF-8 文件中删除 BOM? [复制]
【发布时间】:2017-12-27 15:59:42
【问题描述】:

我有一个带有 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

【问题讨论】:

    标签: linux file command-line utf-8 byte-order-mark


    【解决方案1】:

    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 以及任何没有 printf 内置的 shell,前提是 /usr/bin/printf 是 Gnu 版本),但如果你想要一个与 Posix 兼容的版本,你可以使用:

    sed "$(printf '1s/^\357\273\277//')" file.txt
    

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

    【讨论】:

    【解决方案2】:

    使用 VIM

    1. 在 VIM 中打开文件:

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

       :set nobomb
      
    3. 保存并退出:

       :wq
      

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

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

    这应该删除 BOM,保存文件并退出,所有这些都来自命令行。

    【讨论】:

    • 有没有办法让 vim 以非交互方式执行此操作? OP 要求提供“命令行”解决方案。
    • @DoktorJ 如果您发现了,请务必在此处为其他人发表评论。
    • 它对我来说根本不起作用,因为 vim 期待错误的编码。修复在这里:stackoverflow.com/questions/16507777/…(也许只需要设置文件编码,但我都设置了,我在我的 .vimrc 中做了)
    • @DoktorJ 尝试在vi 中使用-c 标志,例如:vi -c ":set nobomb" -c ":wq" text.xml。这应该删除 BOM,保存文件并从命令行全部退出。
    【解决方案3】:

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

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

    $ sudo apt install dos2unix
    $ dos2unix test.xml
    

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

    $ dos2unix -r test.xml
    

    注意:使用 dos2unix 7.3.4 测试

    【讨论】:

    • 一位 SuSE 用户报告说他们的 dos2unix 版本不这样做。不确定版本号可能是什么,或者它们是否来自同一来源。
    • (我刚才尝试使用来自hub.docker.com/r/opensuse/archiveopensuse/archive Docker 映像进行复制,但这给了我dos2unix 7.3.4,它的工作原理与此答案中宣传的一样。可能是 OpenSUSE 版本 I got 不够古老。head -n 2 /etc/os-releaseget me NAME="openSUSE Leap" VERSION="42.3")
    • @tripleee :嗯..我很高兴你做到了,也很高兴我在我的回答中发布了一个非常具体的版本:-)
    【解决方案4】:

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

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

    【讨论】:

    • 只有在您知道文件以 UTF-8 编码的 BOM 开头时才应该这样做。作为一般建议,这不是一个好主意,因为如果文件不是以 BOM 开头,或者文件是 UTF-16(或任何其他编码),这将破坏数据的前几个有意义的字符。
    【解决方案5】:

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

    可以这样使用:

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

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

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

    【讨论】:

      【解决方案6】:

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

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

      【讨论】:

        猜你喜欢
        • 2021-12-21
        • 1970-01-01
        • 1970-01-01
        • 2014-02-11
        • 2011-06-28
        • 2012-05-04
        相关资源
        最近更新 更多