W plikach pojawia się znak <0xEF, 0xBB, 0xBF>. Jak je usunąć?

86

Kompresuję pliki JavaScript, a kompresor narzeka, że ​​moje pliki mają charakter.

Jak mogę wyszukać te znaki i je usunąć?

Quintin Par
źródło
16
To nie jest <U+FEFF>, to <0xEF,0xBB,0xBF>jest BOM plików UTF8, więc powinieneś zmienić tytuł. Jak chcesz je usunąć? Przez magiczne wróżki? Za pomocą narzędzia wiersza poleceń? Edytując pojedynczo? Notepad ++ może zmienić kodowanie na UTF8 bez BOM. Na przykład tylko wygooglowanie 5 sekund „strip BOM utf8”. Znalazłem to dla Linuksa: ueber.net/who/mjl/projects/bomstrip
xanatos
1
Odpowiedź, która konkretnie dotyczy Twojego problemu, może pomóc, jeśli powiesz nam, jakiego narzędzia javascript używasz do wykonywania kompresji, na jakiej platformie i jakie inne narzędzia są częścią procesu tworzenia.
SingleNegationElimination
15
BOMy w UTF-8 są absolutnie surowe. Musisz znaleźć producenta tego pliku i powiedzieć mu, aby usunął @ # %%.
tchrist
4
@peterflynn: U+FEFFto punkt kodowy Unicode używany dla BOM, ale sam BOM jest kodowany w ten sposób (UTF-8 0xEF 0xBB 0xBF:, UTF-16LE:, 0xFF 0xFEUTF-16BE: 0xFE 0xFFitd.). Zatem pliki, o których mowa, są zakodowane w UTF-8, które kompresor wykrywa podczas dekodowania ich do rzeczywistych punktów kodowania Unicode.
Remy Lebeau
4
@xanatos Niezależnie od tego, co to jest, tak się to objawia i tak ludzie mogą łatwo znaleźć to pytanie za pomocą wyszukiwarek.
BartoszKP

Odpowiedzi:

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

Zakładam, że narzędzie się zepsuje, jeśli masz w plikach inny utf-8, ale jeśli nie, być może to obejście może ci pomóc. (Niesprawdzone ...)

Edycja : dodano -CSDopcję, zgodnie z komentarzem tchrista.

tripleee
źródło
1
Musisz uruchomić z -CSDprzełącznikiem lub z ustawieniem PERL_UNICODEenvariable na SD, aby to zadziałało.
tchrist
Regexp działa OK do usuwania znaku <fffe> na początku linii, aby zastąpić wszystkie znaki <fffe> w linii: 's / \ x {fffe} // g'.
Diego Pino
2
W systemie Mac OSX musiałem zmienić na perl -CSD -pe 's/^\x{feff}//' file.csv:, zwróć uwagę na zmianę z <fffe> na <feff>.
mpettis
1
@mpettis To nie jest zestawienie komponentów, ale zestawienie komponentów z odwróconymi bajtami. Może się to zdarzyć na każdej platformie, jeśli przekonwertujesz UTF-16 na UTF-8 i źle
ustawisz
1
@blong A co z tym? Zadaj osobne pytanie, jeśli nie możesz tego
rozgryźć
185

Możesz je łatwo usunąć za pomocą vima , oto kroki:

1) W terminalu otwórz plik za pomocą vima:

vim file_name

2) Usuń wszystkie znaki BOM :

:set nobomb

3) Zapisz plik:

:wq
Mohammad Anini
źródło
To rozwiązanie zadziałało dla mnie. To jest prostsze niż wybrana odpowiedź. Dzięki
szydan
Skorzystałem z tego świetnego rozwiązania, mimo że normalnie jestem partyzantem emacsa. vim ftw
Ellen Spertus
30

Inna metoda na usunięcie tych znaków - użycie Vima :

vim -b nazwa_pliku

Teraz te „ukryte” znaki są widoczne ( <feff>) i można je usunąć.

ROMANIA_engineer
źródło
20

Dzięki za poprzednie odpowiedzi, oto wariant sed (1) na wszelki wypadek:

sed '1s/^\xEF\xBB\xBF//'
Michael Shigorin
źródło
1
Inne źródła sugerują dołączenie rysunku 1 do wzoru, jak w "sed '1 s / \ xEF \ xBB \ xBF //'", aby dopasować tylko pierwszą linię. Jednak dla mnie na Mac OS X żaden sposób nie działa.
Marian
1
To zadziałało i było dla mnie najlepszym rozwiązaniem. Dziękuję Panu!
Vance Lucas
1
Bardzo podobało mi się to rozwiązanie. Najłatwiejszy do wdrożenia i nadal skalowalny ... :)
Piko
1
@Marian Trochę późno, ale możesz sprawdzić odpowiedź Masuma, która pokazuje, dlaczego nie działa na Macu.
Ktoś nadal używa ciebie MS-DOS
1
Dodaj -i do seda, aby zaktualizować plik (i) ze zmianami.
Johan,
17

W systemie Unix / Linux:

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

W systemie MacOSX

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

Zwróć uwagę na $ po sed dla mac.

W systemie Windows

Istnieje Super Sed , ulepszona wersja seda. W systemie Windows jest to samodzielny plik .exe, przeznaczony do uruchamiania z wiersza poleceń.

Masum
źródło
1
„Zwróć uwagę na znak $ po sed dla komputerów Mac”. - Dziękuję Panu!
Ktoś nadal używa ciebie MS-DOS
1
Ciąg Bash „w stylu C” $'\xEF\xBB\xBF//'jest funkcją Bash, a nie szczególnie funkcją Mac lub OSX. Dzięki temu konstruktowi Bash przeanalizuje sekwencje ucieczki do rzeczywistych bajtów przed przekazaniem wiersza poleceń do sed. W zależności od sedwariantu może to działać lub nie (chociaż jestem pewien, że użytkownicy OSX powinni wiedzieć, że powinno to działać dla nich po wyjęciu z pudełka).
tripleee
1
może sed -i 's /.../.../'
Arthur
6

Używanie ogona może być łatwiejsze:

tail --bytes=+4 filename > new_filename
Dzanvu
źródło
1
Ta technika nie powiedzie się po usunięciu przez producenta pliku BOM. Nie skalowalne ... :)
Piko
4

Rozwiązanie @ tripleee nie działa dla mnie. Ale zmiana kodowania pliku na ASCII i ponownie na UTF-8 załatwiła sprawę :-)

Pablo Torrecilla
źródło
3

Użyłem do tego vimgrep

:vim "[\uFEFF]" *

także zwykłe polecenie wyszukiwania vim

/[\uFEFF]
Olexiy Zamkoviy
źródło
2

Polecenie „plik” pokazuje, czy zestawienie komponentów jest obecne:

Na przykład: „plik mojplik.xml” wyświetla: „Dokument XML 1.0, tekst UTF-8 Unicode (z BOM), z bardzo długimi liniami, z zakończeniami linii CRLF”

dos2unix usunie BOM.

LittletonDoug
źródło
1

W Sublime Text możesz zainstalować pakiet Highlighter, a następnie dostosować wyrażenie regularne w ustawieniach użytkownika.

Tutaj dodałem \uFEFFdo końca highlighter_regexposesji.

{
    "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
}

Aby nadpisać domyślne ustawienia pakietu, umieść plik tutaj:

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

JJD
źródło
1

Sugeruję użycie narzędzia "dos2unix", proszę przetestować, aby uruchomić dos2unix ./thefile.js.

W razie potrzeby spróbuj użyć czegoś takiego dla wielu plików:

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

Moje pozdrowienia.

Wellington, 1993
źródło
1
Podobała mi się twoja odpowiedź - bomstripnie była łatwo dostępna na moim Macu - więc poświęciłem trochę czasu, aby dać ci prostą wersję:find . -type f -exec dos2unix '{}' +
dsz
0

Zapisz plik bez podpisu kodu.

Masood Moshref
źródło