Я ищу (без успеха) для сценария, который работал бы пакетным файлом и позволил бы мне предварительно ожидать текстовый файл UTF-8 с BOM, если он не имеет того.
Ни один язык, который это записано в (жемчуг, Python, c, удар), ни ОС, это продолжает работать, не имеет значения для меня. У меня есть доступ к широкому спектру компьютеров.
Я нашел, что много сценариев делает реверс (разделите BOM), который звучит мне столь довольно глупым, как многие, Windows-программа испытает затруднения при чтении текстовых файлов UTF-8, если у них не будет BOM.
Я пропускал очевидное?
Спасибо!
Я считаю это довольно простым. Предполагая, что файл всегда UTF-8 (вы не определяете кодировку, вы знаете кодировку):
Прочтите первые три символа. Сравните их с последовательностью спецификации UTF-8 (википедия говорит, что это 0xEF, 0xBB, 0xBF). Если это то же самое, распечатайте их в новом файле, а затем скопируйте все остальное из исходного файла в новый файл. Если он другой, сначала распечатайте спецификацию, затем распечатайте три символа и только потом распечатайте все остальное из исходного файла в новый файл.
В C должно быть достаточно fopen / fclose / fread / fwrite.
Я написал этот 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 и рад, что этот скрипт оказался таким полезным!