Добавление спецификации в файлы UTF-8 - PullRequest
37 голосов
/ 27 июня 2010

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

Мне не важен ни язык, на котором он написан (perl, python, c, bash), ни ОС, на которой он работает.У меня есть доступ к широкому кругу компьютеров.

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

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

Спасибо!

Ответы [ 6 ]

41 голосов
/ 20 июля 2010

Я написал этот 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 и рад, что этот скрипт был таким полезным!

28 голосов
/ 25 мая 2016

Самый простой способ, который я нашел для этого, это

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

Обратите внимание, что предполагается, что файл еще не имеет спецификации (!)

12 голосов
/ 05 марта 2016

(Ответ основан на https://stackoverflow.com/a/9815107/1260896 от yingted)

Чтобы добавить спецификации ко всем файлам, начинающимся с "foo-", вы можете использовать sed.sed имеет возможность сделать резервную копию.

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

Если вы точно знаете, что спецификации уже нет, вы можете упростить команду:

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

Убедитесь, что вам нужноустановить UTF-8, потому что то есть UTF-16 отличается (в противном случае проверьте Как я могу повторно добавить маркер порядка байтов Юникода в Linux? )

4 голосов
/ 06 ноября 2018

В качестве улучшения решения Yaron U. вы можете сделать все это в одной строке:

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

Бит cat - говорит о конкатенации к началу source.txt того, что передается из команды печати. Протестировано на OS X и Ubuntu.

3 голосов
/ 27 июня 2010

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

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

В C достаточно fopen / fclose / fread / fwrite.

0 голосов
/ 23 июня 2014

Я создал скрипт на основе Стивена Р. Лумиса кода. https://github.com/Vdragon/addUTF-8bomb

Оформить заказ https://github.com/Vdragon/C_CPP_project_template/blob/development/Tools/convertSourceCodeToUTF-8withBOM.bash.sh для примера использования этого скрипта.

...