Karakter <0xEF, 0xBB, 0xBF> muncul di file. Bagaimana cara menghapusnya?


87

Saya melakukan kompresi file JavaScript dan kompresor mengeluh bahwa file saya memiliki karakter di dalamnya.

Bagaimana cara mencari karakter ini dan menghapusnya?


16
Itu bukan <U+FEFF>, itu adalah <0xEF,0xBB,0xBF>BOM dari file UTF8, jadi Anda harus mengubah judulnya. Bagaimana Anda ingin menghapusnya? Oleh peri ajaib? Dengan alat baris perintah? Dengan mengedit satu per satu? Notepad ++ dapat mengubah pengkodean menjadi UTF8 tanpa BOM. Misalnya hanya googling 5 detik dari "strip BOM utf8" Saya telah menemukan ini untuk Linux: ueber.net/who/mjl/projects/bomstrip
xanatos

1
Ini mungkin membantu Anda mendapatkan jawaban yang secara khusus berkaitan dengan masalah Anda jika Anda memberi tahu kami alat javascript apa yang Anda gunakan untuk melakukan kompresi, pada platform apa, dan alat lain apa yang merupakan bagian dari proses pembuatan Anda.
SingleNegationElimination

15
BOM di UTF-8 benar-benar mentah. Anda perlu mencari produser file itu dan memberi tahu mereka untuk memotong @ # %%.
tchrist

4
@peterflynn: U+FEFFadalah titik kode Unicode yang digunakan untuk BOM, tetapi BOM itu sendiri adalah cara titik kode itu dikodekan (UTF-8 :, 0xEF 0xBB 0xBFUTF-16LE 0xFF 0xFE:, UTF-16BE:, 0xFE 0xFFdll). Jadi, file yang dipermasalahkan adalah dikodekan UTF-8, yang dideteksi oleh kompresor saat mendekodekannya ke titik kode Unicode yang sebenarnya.
Remy Lebeau

4
@xanatos Terlepas dari apa itu, beginilah manifestasinya, dan begitulah cara orang dapat dengan mudah menemukan pertanyaan ini menggunakan mesin telusur.
BartoszKP

Jawaban:


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

Saya akan menganggap alat tersebut akan rusak jika Anda memiliki utf-8 lain di file Anda, tetapi jika tidak, mungkin solusi ini dapat membantu Anda. (Belum teruji ...)

Edit : menambahkan -CSDopsi, sesuai komentar tchrist.


1
Anda perlu menjalankan dengan -CSDsakelar, atau dengan PERL_UNICODEset envariable ke SD, agar berfungsi.
tchrist

Regexp berfungsi dengan baik untuk menghapus karakter <fffe> di awal baris, untuk mengganti semua karakter <fffe> dalam satu baris: 's / \ x {fffe} // g'.
Diego Pino

2
Di Mac OSX, saya harus mengubah ke perl -CSD -pe 's/^\x{feff}//' file.csv:, perhatikan perubahan dari <fffe> menjadi <feff>.
mpettis

1
@mpettis Itu bukan BOM, tapi BOM dengan byte terbalik. Itu bisa terjadi pada platform apa pun, jika Anda mengonversi UTF-16 ke UTF-8 dan mendapatkan urutan byte yang salah (meskipun tujuan BOM adalah untuk mencegah kesalahan itu!)
tripleee

1
@blong Bagaimana dengan itu? Ajukan pertanyaan terpisah jika Anda tidak bisa mengetahuinya (tetapi mungkin akan ditandai sebagai duplikat; klik Google pertama stackoverflow.com/questions/1712188/… )
tripleee

188

Anda dapat dengan mudah menghapusnya menggunakan vim , berikut langkah-langkahnya:

1) Di terminal Anda, buka file menggunakan vim:

vim file_name

2) Hapus semua karakter BOM :

:set nobomb

3) Simpan file:

:wq

Solusi ini berhasil untuk saya. Ini lebih sederhana dari jawaban yang dipilih. Terima kasih
szydan

Saya menggunakan solusi hebat ini meskipun saya biasanya partisan emacs. vim ftw
Ellen Spertus

31

Metode lain untuk menghapus karakter tersebut - menggunakan Vim :

vim -b nama file

Sekarang karakter "tersembunyi" itu terlihat ( <feff>) dan dapat dihapus.


20

Terima kasih atas jawaban sebelumnya, inilah varian sed (1) untuk berjaga-jaga:

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

1
Sumber lain menyarankan untuk menambahkan angka 1 ke pola, seperti dalam "sed '1 s / \ xEF \ xBB \ xBF //'", agar hanya cocok dengan baris pertama. Namun, bagi saya di Mac OS X, tidak ada cara yang berhasil.
Marian

1
Ini berhasil, dan merupakan solusi terbaik bagi saya. Terima kasih Pak!
Vance Lucas

1
Saya menyukai solusi ini. Paling mudah diterapkan dan masih dapat diskalakan ... :)
Piko

1
@ Marian Sedikit terlambat, tetapi Anda dapat memeriksa jawaban Masum yang menunjukkan mengapa ini tidak berfungsi di mac.
Seseorang masih menggunakan Anda MS-DOS

1
Tambahkan -i ke sed untuk memperbarui file dengan perubahan.
Johan

17

Di Unix / Linux:

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

Di MacOSX

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

Perhatikan $ after sed untuk mac.

Di Windows

Ada Super Sed versi sed yang disempurnakan. Untuk Windows, ini adalah .exe mandiri, dimaksudkan untuk dijalankan dari baris perintah.


1
"Perhatikan $ setelah sed untuk mac." - Terima kasih Pak!
Seseorang masih menggunakan Anda MS-DOS

1
String Bash "C-style" $'\xEF\xBB\xBF//'adalah fitur Bash, bukan fitur Mac atau OSX. Dengan cara ini, Bash akan mengurai urutan escape menjadi byte sebenarnya sebelum meneruskan baris perintah ke sed. Bergantung pada sedvarian Anda , ini mungkin atau mungkin tidak berfungsi (meskipun saya yakin itu berguna bagi pengguna OSX untuk mengetahui bahwa itu harus bekerja di luar kotak untuk mereka).
tripleee

1
mungkin sed -i 's /.../.../'
Arthur

6

Menggunakan ekor mungkin lebih mudah:

tail --bytes=+4 filename > new_filename

1
Teknik ini akan gagal setelah produser file menghapus BOM. Tidak terukur ... :)
Piko

4

Solusi @ tripleee tidak berhasil untuk saya. Tetapi mengubah pengkodean file ke ASCII dan lagi ke UTF-8 berhasil :-)


3

Saya telah menggunakan vimgrep untuk ini

:vim "[\uFEFF]" *

juga perintah pencarian vim normal

/[\uFEFF]

2

Perintah 'file' menunjukkan jika BOM ada:

Misalnya: 'file myfile.xml' menampilkan: "Dokumen XML 1.0, teks UTF-8 Unicode (dengan BOM), dengan garis yang sangat panjang, dengan terminator baris CRLF"

dos2unix akan menghapus BOM.



1

Di Sublime Text Anda dapat menginstal paket Highlighter dan kemudian menyesuaikan ekspresi reguler di pengaturan pengguna Anda.

Di sini saya menambahkan \uFEFFke akhir highlighter_regexproperti.

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

Untuk menimpa pengaturan paket default, letakkan file di sini:

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


1

Saya menyarankan penggunaan alat "dos2unix", silakan uji untuk dijalankan dos2unix ./thefile.js.

Jika perlu coba gunakan sesuatu seperti ini untuk banyak file:

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

Salam Hormat.


1
Saya menyukai jawaban Anda - bomstriptidak tersedia dengan mudah di mac saya - jadi find . -type f -exec dos2unix '{}' +
luangkan

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.