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


86

Я роблю стиснення файлів JavaScript, і компресор скаржиться, що мої файли мають характер.

Як я можу шукати цих символів і видаляти їх?


16
Це не так <U+FEFF>, це <0xEF,0xBB,0xBF>те, що є специфікацією файлів UTF8, тому вам слід змінити заголовок. Як ви хочете їх видалити? Чарівними феями? За допомогою інструменту командного рядка? Редагуючи один за одним? Notepad ++ може змінити кодування на UTF8 без специфікації. Наприклад, просто погугливши 5 секунд "strip BOM utf8", я знайшов це для Linux: ueber.net/who/mjl/projects/bomstrip
xanatos

1
Це може допомогти вам отримати відповідь, яка стосується конкретно вашої проблеми, якщо ви повідомили нам, який інструмент javascript ви використовуєте для стиснення, на якій платформі та які інші інструменти є частиною вашого процесу збірки.
SingleNegationElimination

15
Специфікації специфікації в UTF-8 є абсолютно неочікуваними. Вам потрібно знайти виробника цього файлу і сказати їм, щоб вирізали його на @ # %%.
christ

4
@peterflynn: U+FEFFє кодовою точкою Unicode, яка використовується для специфікації, але сама специфікація - це те, як кодується ця кодова точка (UTF-8:, 0xEF 0xBB 0xBFUTF-16LE:, 0xFF 0xFEUTF-16BE: 0xFE 0xFFтощо). Отже, файли, про які йде мова, кодуються UTF-8, які компресор виявляє, декодуючи їх до фактичних кодових точок Unicode.
Remy Lebeau

4
@xanatos Незалежно від того, що це таке, воно так проявляється, і саме тому люди можуть легко знайти це питання за допомогою пошукових систем.
BartoszKP

Відповіді:


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

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

Редагувати : додано -CSDопцію, відповідно до коментаря christ.


1
Вам потрібно запустити -CSDперемикач або з PERL_UNICODEнезмінним значенням SD, щоб це працювало.
trist

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 і помилково
вкажете

1
@blong Що з цим? Задайте окреме питання , якщо ви не можете зрозуміти це (але це, ймовірно , буде позначена як дублікат, перший Google хіт stackoverflow.com/questions/1712188 / ... )
tripleee

185

Ви можете легко видалити їх за допомогою vim , ось кроки:

1) У своєму терміналі відкрийте файл за допомогою vim:

vim file_name

2) Видаліть усі символи специфікації :

:set nobomb

3) Збережіть файл:

:wq

Це рішення спрацювало для мене. Це простіше, ніж обрана відповідь. Дякую
szydan

Я використав це чудове рішення, хоча, як правило, я є прихильником emacs. vim ftw
Еллен Спертус

30

Інший спосіб видалення цих символів - використання Vim :

vim -b ім'я файлу

Тепер ці "приховані" символи видно ( <feff>) і їх можна видалити.


20

Дякую за попередні відповіді, ось варіант sed (1) про всяк випадок:

sed '1s/^\xEF\xBB\xBF//'

1
Інші джерела пропонують додавати малюнок 1 до шаблону, як у "sed '1 s / \ xEF \ xBB \ xBF //'", щоб відповідати лише першому рядку. Однак для мене на Mac OS X жоден спосіб не працює.
Marian

1
Це спрацювало, і для мене було найкращим рішенням. Спасибі пане!
Венс Лукас,

1
Полюбив це рішення. Найпростіший у реалізації і все ще масштабований ... :)
Піко

1
@Marian Трохи пізно, але ви можете перевірити відповідь Масума, яка показує, чому це не спрацювало на mac.
Хтось все ще використовує вас MS-DOS

1
Додайте -i до sed, щоб оновити файл (и) зі змінами.
Йохан

17

На Unix / Linux:

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

На MacOSX

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

Зверніть увагу на $ after sed для mac.

У Windows

Існує Super Sed покращена версія sed. Для Windows це автономний файл .exe, призначений для запуску з командного рядка.


1
"Зверніть увагу на $ після sed для mac." - Спасибі пане!
Хтось все ще використовує вас MS-DOS

1
Рядок "B" у стилі $'\xEF\xBB\xBF//'Bash - це функція Bash, не особливо функція Mac або OSX. З цією конструкцією Bash проаналізує послідовності екранування на фактичні байти перед передачею командного рядка sed. Залежно від вашого sedваріанту, це може працювати, а може і не працювати (хоча я впевнений, що корисно для користувачів OSX знати, що це має працювати нестандартно для них).
триплі

1
можливо sed -i 's /.../.../'
Артур,

6

Використання хвоста може бути простішим:

tail --bytes=+4 filename > new_filename

1
Цей прийом не вдасться після видалення файлу специфікації файлу. Не масштабовано ... :)
Піко

4

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



2

Команда 'файл' показує, якщо специфікація присутня:

Наприклад: "файл myfile.xml" відображає: "Документ XML 1.0, текст UTF-8 Unicode (зі специфікацією), з дуже довгими рядками, із закінчувачами рядків CRLF"

dos2unix видалить специфікацію.



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


1

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

При необхідності спробуйте використати щось подібне для кількох файлів:

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

З повагою.


1
Мені сподобалась ваша відповідь - вона bomstripбула непросто доступною на моєму mac - тому find . -type f -exec dos2unix '{}' +
знаходьте

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.