Добавление BOM в файлы UTF-8

Я ищу (без успеха) для сценария, который работал бы пакетным файлом и позволил бы мне предварительно ожидать текстовый файл UTF-8 с BOM, если он не имеет того.

Ни один язык, который это записано в (жемчуг, Python, c, удар), ни ОС, это продолжает работать, не имеет значения для меня. У меня есть доступ к широкому спектру компьютеров.

Я нашел, что много сценариев делает реверс (разделите BOM), который звучит мне столь довольно глупым, как многие, Windows-программа испытает затруднения при чтении текстовых файлов UTF-8, если у них не будет BOM.

Я пропускал очевидное?

Спасибо!

42
задан Stephane 9 November 2018 в 14:57
поделиться

2 ответа

Я считаю это довольно простым. Предполагая, что файл всегда UTF-8 (вы не определяете кодировку, вы знаете кодировку):

Прочтите первые три символа. Сравните их с последовательностью спецификации UTF-8 (википедия говорит, что это 0xEF, 0xBB, 0xBF). Если это то же самое, распечатайте их в новом файле, а затем скопируйте все остальное из исходного файла в новый файл. Если он другой, сначала распечатайте спецификацию, затем распечатайте три символа и только потом распечатайте все остальное из исходного файла в новый файл.

В C должно быть достаточно fopen / fclose / fread / fwrite.

3
ответ дан 26 November 2019 в 23:33
поделиться

Я написал этот 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
ответ дан 26 November 2019 в 23:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: