web-dev-qa-db-ja.com

BOMをUTF-8ファイルに追加する

私は(成功せずに)スクリプトを検索しています。スクリプトはバッチファイルとして機能し、UTF-8テキストファイルにBOMがない場合は、その前にBOMを追加できます。

それが書かれている言語(Perl、python、c、bash)も、動作するOSも私には関係ありません。さまざまなコンピューターにアクセスできます。

多くのWindowsプログラムがBOMがない場合、UTF-8テキストファイルを読み取るのに問題があるため、逆に(BOMを取り除く)ためのスクリプトがたくさん見つかりました。

私は明白を逃したのですか?

ありがとう!

43
Stephane

このaddbom.shは、「file」コマンドと [〜#〜] icu [〜#〜] の「uconv」コマンドを使用して作成しました。

#!/bin/sh

if [ $# -eq 0 ]
then
        echo usage $0 files ...
        exit 1
fi

for file in "$@"
do
        echo "# Processing: $file" 1>&2
        if [ ! -f "$file" ]
        then
                echo Not a file: "$file" 1>&2
                exit 1
        fi
        TYPE=`file - < "$file" | cut -d: -f2`
        if echo "$TYPE" | grep -q '(with BOM)'
        then
                echo "# $file already has BOM, skipping." 1>&2
        else
                ( mv "${file}" "${file}"~ && uconv -f utf-8 -t utf-8 --add-signature < "${file}~" > "${file}" ) || ( echo Error processing "$file" 1>&2 ; exit 1)
        fi
done

edit:mv引数を引用符で囲みました。 @DirkRに感謝します。このスクリプトがとても役に立ちました。

45

これのために私が見つけた最も簡単な方法は

#!/usr/bin/env bash

#Add BOM to the new file
printf '\xEF\xBB\xBF' > with_bom.txt

# Append the content of the source file to the new file
cat source_file.txt >> with_bom.txt

私はそれが外部プログラム(猫)を使用していることを知っています...しかしそれはbashで簡単に仕事をします

OSXでテスト済みですが、Linuxでも動作するはずです。

ファイルにはまだBOM(!)がないことを前提としています。

31
Yaron U.

(回答は https://stackoverflow.com/a/9815107/1260896 yingtedによる)

「foo-」で始まるすべてのファイルにBOMを追加するには、sedを使用できます。 sedには、バックアップを作成するオプションがあります。

sed -i '1s/^\(\xef\xbb\xbf\)\?/\xef\xbb\xbf/' foo-*

BOMが既に存在しないことが確実な場合は、コマンドを簡略化できます。

sed -i '1s/^/\xef\xbb\xbf/' foo-*

つまり、UTF-16が異なるため、UTF-8を設定する必要があることを確認してください(それ以外の場合は LinuxでUnicodeバイトオーダーマーカーを再度追加するにはどうすればよいですか?

13
Franklin Piat

Yaron U.のソリューションの改善点として、すべてを1行で行うことができます。

printf '\xEF\xBB\xBF' | cat - source.txt > source-with-bom.txt

cat -ビットは、印刷コマンドから何がパイプされているかをsource.txtの前に連結することを示しています。 OS XとUbuntuでテスト済み。

7
Trenton

とても簡単だと思います。ファイルがalways UTF-8であると想定します(エンコーディングが検出されない場合、knowエンコーディング):

最初の3文字を読みます。それらをUTF-8 BOMシーケンスと比較します(ウィキペディアによると0xEF、0xBB、0xBFです)。同じ場合は、それらを新しいファイルに印刷してから、他のすべてを元のファイルから新しいファイルにコピーします。異なる場合は、最初にBOMを印刷し、次に3文字を印刷してから、元のファイルから新しいファイルにそれ以外のすべてを印刷します。

Cでは、fopen/fclose/fread/fwriteで十分です。

3
luiscubal

Steven R. Loomis のコードに基づいてスクリプトを作成しました。 https://github.com/Vdragon/addUTF-8bomb

チェックアウト https://github.com/Vdragon/C_CPP_project_template/blob/development/Tools/convertSourceCodeToUTF-8withBOM.bash.sh このスクリプトの使用例。

0
Vdragon