web-dev-qa-db-ja.com

UTF-8ファイルからBOMを削除するにはどうすればよいですか?

BOMを使用したUTF-8エンコードのファイルがあり、BOMを削除したい。ファイルからBOMを削除するLinuxコマンドラインツールはありますか?

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

BOMはUnicodeコードポイントU + FEFFです。 UTF-8エンコードは、3つの16進値0xEF、0xBB、0xBFで構成されています。

Bashを使用すると、Unicodeエスケープを実装する特別な引用形式_$''_を使用してUTF-8 BOMを作成できます:_$'\uFEFF'_。 bashを使用する場合、テキストファイルの先頭からUTF-8 BOMを削除する信頼できる方法は次のとおりです。

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

これにより、ファイルがUTF-8 BOMで始まっていない場合は変更されずに残り、そうでない場合はBOMが削除されます。

他のシェルを使用している場合、"$(printf '\ufeff')"がBOM文字を生成することに気付くかもしれません(zsh組み込みのprintfのないシェルと同様に、_/usr/bin/printf_はGnuバージョン)ですが、Posix互換バージョンが必要な場合は次を使用できます。

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

(_-i_インプレース編集フラグもGnu拡張です。このバージョンは、変更された可能性のあるファイルをstdoutに書き込みます。)

21
rici

VIMを使用する

  1. VIMでファイルを開く:

    vi text.xml
    
  2. BOMエンコーディングを削除します。

    :set nobomb
    
  3. 保存して終了:

    :wq
    
15
Joshua Pinter

tailコマンドを使用して、ファイルからBOMを削除することができます。

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

さて、今日これに対処しましたが、私の好ましい方法はdos2unixでした。

dos2unixは、BOMを削除し、他のSOからの他の特異性も処理します。

$ Sudo apt install dos2unix
$ dos2unix test.xml

BOMのみを削除することもできます(-r、-remove-bom):

$ dos2unix -r test.xml

注: dos2unix 7.3.4でテスト済み

3