UTF-8テキストファイルにBOMがあるかどうかを確認するには?

UTF-8テキストファイルにBOMがあるかどうかを確認するには?

UTF-8テキストファイルがあるかどうかを確認する方法品目明細コマンドラインから?

fileコマンドは以下を表示します。

UTF-8 Unicode text

しかし、これがファイルにBOMがないことを意味するかどうかはわかりません。

Ubuntu 12.04を使用しています。

答え1

fileあれば教えてください品目明細。簡単にテストできます。

printf '\ufeff...\n' | file -
/dev/stdin: UTF-8 Unicode (with BOM) text

一部のシェル(たとえば、ashまたは)にはサポートされていない組み込みコマンドdashがあり、その場合はGNU coreutils(たとえば)を使用する必要があります。printf\uprintf/usr/bin/printf


注:変更ログによると、fileこの機能は2007年から使用されました。したがって、これは現在すべてのコンピュータで動作します。

答え2

実行すると、stat fileName正確に3つの文字が表示されます。エディタでファイルを開くと、何も表示されません。したがって、ファイルサイズが3であることがわかると、ファイルにBOMがあることが明らかになります。

また、投稿はここ私にとってとても役に立ちました。

hexdump -n 3 -C 2.txt
00000000 ef bb bf
ef bb bf // YES

答え3

別の変形 - dos2unix:

$ dos2unix -ib   *.txt
  no-bom f1.txt                 # this file has no BOM
  utf-8  f2.txt                 # this file has BOM + UTF-8
 

このコマンドには、BOMの追加や削除などのファイル形式を変更するオプションがあります。

答え4

BOMを持つUTF-8ファイルは、3バイト0xef 0xbb 0xbfで始まります。これはU + FEFF文字のUTF-8エンコーディングです。

ファイルの最初の3バイトを読むと、bashでこれらのファイルを効率的に見つけることができます。

find . -type f -size +2c -print0 |
  while IFS= read -rd '' file; do
    IFS= LC_ALL=C read -rd '' -n3 first3 < "$file" &&
      [[ $first3 = $'\xef\xbb\xbf' ]] &&
      printf '%s\n' "$file"
  done

ファイルの残りの部分が有効なUTF-8であることを確認しませんが、どちらもfile経験的な方法です。

関連情報