Символ <0xEF, 0xBB, 0xBF> отображается в файлах. Как их удалить?

86

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

Как мне найти этих персонажей и удалить их?

Квинтин Пар
источник
16
Это не так <U+FEFF>, это <0xEF,0xBB,0xBF>спецификация файлов UTF8, поэтому вам следует изменить заголовок. Как бы вы хотели их удалить? Волшебными феями? С помощью инструмента командной строки? Редактируя по одному? Notepad ++ может изменять кодировку на UTF8 без спецификации. Например, просто поискав в Google 5 секунд "strip BOM utf8", я нашел это для Linux: ueber.net/who/mjl/projects/bomstrip
xanatos
1
Это может помочь вам получить ответ, который конкретно относится к вашей проблеме, если вы сообщите нам, какой инструмент javascript вы используете для сжатия, на какой платформе и какие другие инструменты являются частью вашего процесса сборки.
SingleNegationElimination
15
Спецификации в UTF-8 являются абсолютной грязью. Вам нужно найти производителя этого файла и попросить его вырезать @ # %%.
tchrist
4
@peterflynn: кодовая точка U+FEFFUnicode, используемая для спецификации, но сама спецификация - это то, как кодируется эта кодовая точка (UTF-8:, 0xEF 0xBB 0xBFUTF-16LE:, 0xFF 0xFEUTF-16BE: 0xFE 0xFFи т. д.). Таким образом, файлы, о которых идет речь, имеют кодировку UTF-8, которую компрессор обнаруживает при декодировании их в фактические кодовые точки Unicode.
Реми Лебо
4
@xanatos Независимо от того, что это такое, вот как это проявляется, и именно так люди могут легко найти этот вопрос с помощью поисковых систем.
BartoszKP

Ответы:

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

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

Изменить : добавлен -CSDпараметр в соответствии с комментарием Христа.

тройной
источник
1
Вам нужно запустить с -CSDпереключателем или с PERL_UNICODEenvariable, установленным на SD, чтобы это работало.
tchrist
Regexp работает нормально для удаления символа <fffe> в начале строки, чтобы заменить все символы <fffe> в строке: 's / \ x {fffe} // g'.
Диего Пино
2
В Mac OSX мне пришлось изменить на: perl -CSD -pe 's/^\x{feff}//' file.csvобратите внимание на изменение с <fffe> на <feff>.
mpettis
1
@mpettis Значит, это не спецификация, а спецификация с перевернутыми байтами. Это может произойти на любой платформе, если вы конвертируете UTF-16 в UTF-8 и получите неправильный порядок байтов (хотя цель спецификации - предотвратить эту ошибку!)
Tripleee
1
@blong Что с этим? Задайте отдельный вопрос, если вы не можете понять это (но он, вероятно, будет отмечен как дубликат; первое
tripleee
185

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

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

vim file_name

2) Удалите все символы спецификации :

:set nobomb

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

:wq
Мохаммад Анини
источник
Это решение сработало для меня. Это проще, чем выбранный ответ. Спасибо
szydan
Я использовал это отличное решение, хотя обычно я сторонник emacs. vim ftw
Ellen
30

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

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

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

РУМЫНИЯ_engineer
источник
20

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

sed '1s/^\xEF\xBB\xBF//'
Михаил Шигорин
источник
1
Другие источники предлагают добавить цифру 1 к шаблону, как в "sed '1 s / \ xEF \ xBB \ xBF //'", чтобы соответствовать только первой строке. Однако для меня в Mac OS X ни один из способов не работает.
Мариан
1
Это сработало и было для меня лучшим решением. Спасибо, сэр!
Вэнс Лукас
1
Очень понравилось это решение. Самый простой в реализации и при этом масштабируемый ... :)
Пико
1
@Marian Немного поздно, но вы можете проверить ответ Масума, который показывает, почему он не работал на Mac.
Кто-то по-прежнему использует вашу MS-DOS
1
Добавьте -i в sed, чтобы обновить файл (ы) с изменениями.
Johan
17

В 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, предназначенный для запуска из командной строки.

Масум
источник
1
«Обратите внимание на $ после sed для Mac». - Спасибо, сэр!
Кто-то все еще использует вашу MS-DOS
1
Строка Bash "C-style" $'\xEF\xBB\xBF//'- это функция Bash, не особенно функция Mac или OSX. С помощью этой конструкции Bash проанализирует escape-последовательности на фактические байты перед передачей командной строки в sed. В зависимости от вашего sedварианта это может сработать, а может и не сработать (хотя я уверен, что пользователям OSX будет полезно знать, что для них это должно работать из коробки).
Tripleee
1
может быть, sed -i 's /.../.../'
Артур
6

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

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

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

Пабло Торресилья
источник
3

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

:vim "[\uFEFF]" *

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

/[\uFEFF]
Алексей Замковый
источник
2

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

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

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

ЛиттлтонДуг
источник
1

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

Никита Кокшаров
источник
1

В 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

JJD
источник
1

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

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

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

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

Веллингтон, 1993
источник
1
Мне понравился ваш ответ - его bomstripбыло нелегко получить на моем Mac, поэтому не find . -type f -exec dos2unix '{}' +
торопитесь,
0

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

Масуд Мошреф
источник