Символ ‹0xEF,0xBB,0xBF›, отображаемый в файлах. Как их удалить?

Я сжимаю файлы JavaScript, и компрессор жалуется, что в моих файлах есть символ .

Как я могу найти эти символы и удалить их?


person Quintin Par    schedule 04.09.2011    source источник
comment
Это не <U+FEFF>, это <0xEF,0xBB,0xBF>, это спецификация файлов UTF8, поэтому вам следует изменить заголовок. Как бы вы хотели их удалить? Волшебными феями? Инструментом командной строки? Редактируя один за другим? Notepad++ может изменить кодировку на UTF8 без спецификации. Например, просто погуглив 5 секунд полосы BOM utf8, я нашел это для Linux: ueber .net/who/mjl/projects/bomstrip   -  person xanatos    schedule 04.09.2011
comment
Если вы сообщите нам, какой инструмент javascript вы используете для сжатия, на какой платформе и какие другие инструменты являются частью вашего процесса сборки, это может помочь вам получить ответ, конкретно относящийся к вашей проблеме.   -  person SingleNegationElimination    schedule 04.09.2011
comment
Спецификации в UTF-8 — абсолютная ерунда. Вам нужно найти производителя этого файла и попросить его вырезать @#%%.   -  person tchrist    schedule 04.09.2011
comment
@xanatos Это звучит как <U+FEFF> является спецификацией UTF-16. Поскольку JavaScript представляет строки способом, подобным UTF-16 (UCS-2), я считаю, что спецификация UTF-8 может оказаться похожей на спецификацию UTF-16 при обработке файла с помощью инструментов на основе JavaScript (например, инструменты разработки браузера / Инспектор узлов или в JS API, например String.charCodeAt()). Это могло бы объяснить то, что видел @QuintinPar.   -  person peterflynn    schedule 30.01.2015
comment
@peterflynn: U+FEFF — это кодовая точка Unicode, используемая для спецификации, но сама спецификация — это то, как кодируется эта кодовая точка (UTF-8: 0xEF 0xBB 0xBF, UTF-16LE: 0xFF 0xFE, UTF-16BE: 0xFE 0xFF и т. д.). Таким образом, рассматриваемые файлы имеют кодировку UTF-8, которую компрессор обнаруживает при декодировании их в фактические кодовые точки Unicode.   -  person Remy Lebeau    schedule 19.06.2015
comment
@xanatos Независимо от того, что это такое, именно так оно проявляется, и именно так люди могут легко найти этот вопрос с помощью поисковых систем.   -  person BartoszKP    schedule 22.09.2015
comment
Если вы хотите просто показать файлы, содержащие символ BOM, используйте этот: grep $'\xEF\xBB\xBF' *.*   -  person rubo77    schedule 15.06.2020


Ответы (13)


perl -pi~ -CSD -e 's/^\x{fffe}//' file1.js path/to/file2.js

Я предполагаю, что инструмент сломается, если в ваших файлах есть другие utf-8, но если нет, возможно, этот обходной путь может вам помочь. (Не проверено...)

Изменить: добавлена ​​опция -CSD согласно комментарию tchrist.

person tripleee    schedule 04.09.2011
comment
Вам нужно запустить с переключателем -CSD или с переменной PERL_UNICODE, установленной на SD, чтобы это сработало. - person tchrist; 04.09.2011
comment
Регулярное выражение работает нормально для удаления символа ‹fffe› в начале строки, чтобы заменить все символы ‹fffe› в строке: 's/\x{fffe}//g'. - person Diego Pino; 26.12.2011
comment
В Mac OSX мне пришлось изменить на: perl -CSD -pe 's/^\x{feff}//' file.csv , обратите внимание на изменение с ‹fffe› на ‹feff›. - person mpettis; 06.02.2014
comment
@mpettis Тогда это не спецификация, а спецификация с перевернутыми байтами. Это может произойти на любой платформе, если вы конвертируете UTF-16 в UTF-8 и получаете неправильный порядок байтов (даже несмотря на то, что цель спецификации состоит в том, чтобы предотвратить эту ошибку!) - person tripleee; 24.11.2014
comment
Как насчет того, чтобы запустить это для всего каталога? - person blong; 13.04.2017
comment
@blong Как насчет этого? Задайте отдельный вопрос, если вы не можете понять это (но он, вероятно, будет помечен как дубликат; сначала нажмите Google stackoverflow.com/questions/1712188 /) - person tripleee; 13.04.2017

Вы можете легко удалить их с помощью vim, вот шаги:

1) В терминале откройте файл с помощью vim:

vim file_name

2) Удалите все символы BOM:

:set nobomb

3) Сохраните файл:

:wq
person Mohammad Anini    schedule 28.02.2013
comment
Это решение сработало для меня. Это проще, чем выбранный ответ. Спасибо - person szydan; 04.11.2014
comment
Я использовал это отличное решение, хотя обычно я сторонник emacs. вим фтв - person Ellen Spertus; 06.07.2019

Другой способ удалить эти символы — с помощью Vim:

vim -b имя_файла

Теперь эти «скрытые» символы видны (<feff>) и могут быть удалены.

person Elrond_EGLDer    schedule 12.11.2014

Спасибо за предыдущие ответы, вот вариант sed(1) на всякий случай:

sed '1s/^\xEF\xBB\xBF//'
person Michael Shigorin    schedule 23.04.2013
comment
Другие источники предлагают добавлять цифру 1 к шаблону, как в sed '1 s/\xEF\xBB\xBF//', чтобы соответствовать только первой строке. Однако для меня в Mac OS X ни один из способов не работает. - person Marian; 10.10.2013
comment
Это сработало и было лучшим решением для меня. Спасибо, сэр! - person Vance Lucas; 21.05.2014
comment
Понравилось это решение. Самый простой в реализации и все еще масштабируемый... :) - person Piko; 01.04.2015
comment
@Marian Немного поздно, но вы можете проверить ответ Масума, который показывает, почему он не работал на Mac. - person Somebody still uses you MS-DOS; 14.04.2015
comment
Добавьте -i к sed, чтобы обновить файл(ы) с изменениями. - person Johan; 14.07.2017

В Unix/Linux:

sed 's/\xEF\xBB\xBF//' < inputfile > outputfile

В MacOSX

sed $'s/\xEF\xBB\xBF//' < inputfile > outputfile

Обратите внимание на $ после sed для mac.

В Windows

Существует Super Sed, расширенная версия sed. Для Windows это автономный .exe, предназначенный для запуска из командной строки.

person Masum    schedule 07.04.2015
comment
Обратите внимание на $ после sed для mac. - Спасибо, сэр! - person Somebody still uses you MS-DOS; 14.04.2015
comment
Строка $'\xEF\xBB\xBF//' в стиле Bash C — это функция Bash, а не функция Mac или OSX. С этой конструкцией Bash будет анализировать escape-последовательности в фактические байты перед передачей командной строки в sed. В зависимости от вашего варианта sed это может работать или не работать (хотя я уверен, что пользователям OSX полезно знать, что для них это должно работать из коробки). - person tripleee; 14.07.2015
comment
может быть, sed -i s/.../.../' - person Arthur; 25.11.2016

Использование tail может быть проще:

tail --bytes=+4 filename > new_filename
person Dzanvu    schedule 26.11.2013
comment
Этот метод потерпит неудачу после того, как производитель файла удалит спецификацию. Не масштабируется... :) - person Piko; 01.04.2015

Решение @tripleee мне не помогло. Но смена кодировки файла на ASCII и снова на UTF-8 сделала свое дело :-)

person Pablo Torrecilla    schedule 03.04.2012

Я использовал vimgrep для этого

:vim "[\uFEFF]" *

также обычная команда поиска vim

/[\uFEFF]
person Olexiy Zamkoviy    schedule 10.03.2016

Команда «файл» показывает, присутствует ли спецификация:

Например: «file myfile.xml» отображает: «Документ XML 1.0, текст UTF-8 Unicode (с спецификацией), с очень длинными строками, с разделителями строк CRLF»

dos2unix удалит спецификацию.

person LittletonDoug    schedule 19.05.2017

В Windows вы можете использовать бэкпортированную утилиту recode из UnxUtils .

person Nikita Koksharov    schedule 14.04.2013

В Sublime Text вы можете установить Пакет Highlighter, а затем настройте регулярное выражение в настройках пользователя.

Здесь я добавил \uFEFF в конец свойства highlighter_regex.

{
    "highlighter_enabled": true,
    "highlighter_regex": "(\t+ +)|( +\t+)|[\u2026\u2018\u2019\u201c\u201d\u2013\u2014\uFEFF]|[\t ]+$",
    "highlighter_scope_name": "invalid",
    "highlighter_max_file_size": 1048576,
    "highlighter_delay": 3000
}

Чтобы перезаписать настройки пакета по умолчанию, поместите файл сюда:

~/.config/sublime-text-3/Packages/User/highlighter.sublime-settings

person JJD    schedule 09.01.2015

Я предлагаю использовать инструмент "dos2unix", проверьте запуск dos2unix ./thefile.js.

При необходимости попробуйте использовать что-то подобное для нескольких файлов:

for x in $(find . -type f -exec echo {} +); do dos2unix $x ; done

Мое почтение.

person Wellington1993    schedule 17.12.2018
comment
Мне понравился ваш ответ - bomstrip не был легко доступен на моем Mac, поэтому нашел время, чтобы дать вам простую версию: find . -type f -exec dos2unix '{}' + - person dsz; 05.03.2020

Сохраните файл без подписи кода.

person Masood Moshref    schedule 17.04.2015