Как удалить спецификацию из файла UTF-8?


У меня есть файл в кодировке UTF-8 с BOM и я хочу удалить BOM. Существуют ли какие-либо средства командной строки linux для удаления спецификации из файла?

$ file test.xml
test.xml:  XML 1.0 document, UTF-8 Unicode (with BOM) text, with very long lines
3 6

3 ответа:

BOM-это Unicode codepoint U+FEFF; кодировка UTF-8 состоит из трех шестнадцатеричных значений 0xEF, 0xBB, 0xBF.

С помощью bash можно создать спецификацию UTF-8 со специальной формой кавычек $'', которая реализует эскейпы Unicode: $'\uFEFF'. Таким образом, в случае bash надежным способом удаления спецификации UTF-8 из начала текстового файла будет:

sed -i $'1s/^\uFEFF//' file.txt

Это позволит оставить файл без изменений, если он не начинается с спецификации UTF-8, а в противном случае удалить спецификацию.

Если вы используете некоторые другая оболочка, вы можете обнаружить, что "$(printf '\ufeff')" производит символ BOM (который работает с zsh, а также с любой оболочкой без printf встроенного, при условии, что /usr/bin/printf является версией Gnu), но если вы хотите Posix-совместимую версию, вы можете использовать:

sed "$(printf '1s/^\357\273\277//)" file.txt

(флаг редактирования -i на месте также является расширением Gnu; эта версия записывает возможно измененный файл в stdout.)

Использование VIM

  1. Открыть файл в VIM:

    vi text.xml
    
  2. Удалить кодировку спецификации:

    :set nobomb
    
  3. Сохранить и выйти:

    :wq
    

Можно удалить спецификацию из файла с помощью команды tail:

tail --bytes=+4 withBOM.txt > withoutBOM.txt