59

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

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

多くの Windows プログラムでは、BOM がないと UTF-8 テキスト ファイルを読み取るのに問題があるため、逆の処理 (BOM を削除する) を行うスクリプトを多数見つけました。

明らかなことを見逃しましたか?

ありがとう!

4

7 に答える 7

50

「file」コマンドとICUの「uconv」コマンドを使用して、この addbom.sh を作成しました。

#!/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

編集:mv引数を引用符で囲みました。@DirkR に感謝します。このスクリプトが役に立ってよかったです。

于 2010-07-20T19:58:34.237 に答える
49

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

#!/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

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

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

ファイルにまだ BOM がないことを前提としていることに注意してください (!)

于 2016-05-24T22:48:22.517 に答える
23

( https://stackoverflow.com/a/9815107/1260896 by 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 でユニコード バイト オーダー マーカーを再追加するにはどうすればよいですか? を確認してください) 。

于 2016-03-04T22:19:28.127 に答える
3

とてもシンプルだと思います。ファイルが常にUTF-8であると仮定します(エンコーディングを検出していないため、エンコーディングを知っています):

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

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

于 2010-06-27T13:18:24.217 に答える
0

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

このスクリプトの使用例については、https://github.com/Vdragon/C_CPP_project_template/blob/development/Tools/convertSourceCodeToUTF-8withBOM.bash.shを確認してください。

于 2014-06-23T09:08:09.297 に答える