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?

Quintin Par
sumber
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.

tripleee
sumber
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
Mohammad Anini
sumber
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.

ROMANIA_engineer
sumber
20

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

sed '1s/^\xEF\xBB\xBF//'
Michael Shigorin
sumber
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.

Masum
sumber
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
Dzanvu
sumber
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 :-)

Pablo Torrecilla
sumber
3

Saya telah menggunakan vimgrep untuk ini

:vim "[\uFEFF]" *

juga perintah pencarian vim normal

/[\uFEFF]
Olexiy Zamkoviy
sumber
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.

LittletonDoug
sumber
1

Di windows Anda dapat menggunakan utilitas pengodean ulang yang di- backport dari UnxUtils .

Nikita Koksharov
sumber
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

JJD
sumber
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.

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

Simpan file tanpa tanda tangan kode.

Masood Moshref
sumber