Saya memiliki beberapa file yang rusak dengan simbol ini:
^ @
Itu bukan bagian dari string; itu tidak dapat ditelusuri. Bagaimana cara mengganti simbol ini dengan tidak ada, atau bagaimana cara menghapus simbol ini?
Ini adalah contoh baris dari satu file:
^@F^@i^@l^@e^@n^@a^@m^@e^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@:^@ ^@^M^@
sumber
Saya tidak berpikir file Anda rusak. Baris contoh Anda sepertinya berisi teks biasa dengan byte nol di antara setiap karakter. Ini menunjukkan bahwa ini adalah file teks yang telah dikodekan dalam UTF-16 tetapi tanda byte-order tidak ada sejak awal file. Lihat http://en.wikipedia.org/wiki/Byte-order_mark
Misalkan saya membuka Notepad, ketik kata 'filename', dan simpan sebagai Unicode Big-endian. Tumpukan hex file ini terlihat seperti ini:
Jika saya membuka file ini di Vim terlihat baik - byte 'fe ff' memberi tahu Vim bagaimana file dikodekan. Sekarang anggaplah saya membuat file yang berisi urutan byte yang sama persis, tetapi tanpa 'fe ff' terkemuka. Sisipan Vim ^ @ (atau <00>, tergantung pada konfigurasi Anda), menggantikan byte nol; Notepad menyisipkan spasi.
Jadi daripada menghapus nulls, Anda harus benar-benar mencari untuk mendapatkan Vim untuk menafsirkan file dengan benar. Anda bisa meminta Vim memuat ulang file dengan penyandian yang benar dengan perintah:
sumber
Ini sebenarnya bekerja untuk saya dalam vim:
sumber
<Ctrl-V><Ctrl-2>
(dan juga yang<Ctrl-Shift-2>
bekerja), tetapi ini berhasil.'Simbol' itu mewakili karakter NULL, dengan nilai ASCII 000.
Sulit untuk menghapus dengan vim, coba
sumber
Seperti yang telah dicatat orang lain, itu adalah byte nol (ASCII 00). Di Linux, cara memasukkan nilai ASCII ke vim adalah dengan menekan Ctrl-V diikuti dengan nilai oktal 3 digit dari karakter apa pun. Untuk mengganti semua byte nol, gunakan:
:%s/
Ctrl-V000//g
(tanpa spasi).
Anda juga dapat mencari nulls dengan:
/
Ctrl-V000
Dalam kedua kasus, itu tidak akan menampilkan nol saat Anda mengetik, tetapi setelah memasukkan ketiganya, itu akan ditampilkan
^@
. Pada terminal warna itu akan menunjukkan bahwa dengan warna biru untuk menunjukkan bahwa itu adalah karakter kontrol.sumber
FWIW, dalam kasus saya, saya harus menggunakan vim di cygwin untuk mengedit file teks yang dibuat pada mac. Solusi yang diterima tidak bekerja untuk saya, tetapi sudah dekat. Menurut halaman wiki Vim tentang bekerja dengan Unicode , ada perbedaan antara versi Big Endian dan Little Endian dari byte BOM. Jadi, saya harus secara eksplisit mengatakan
vim
untuk menggunakan versi Little BOM encoding BOM.Hanya setelah memilih pengkodean yang tepat saya mengkonversi format file (akhiran garis)
dos
sehingga saya dapat mengedit file di Windows editor. Mencoba mengatur ulang format file sebelum menentukan pengkodean memberi saya kesedihan. Ini daftar lengkap perintah yang saya gunakan:sumber
Solusi yang diterima tidak berhasil untuk saya. Saya membuat vim mem-pipe file melalui
tr
gantinya:Ini juga akan bekerja dengan baik dengan mode visual (cukup ketik
:!tr -d '\000'
) atau pada berbagai baris:sumber
^@
bukan karakter buruk jika Anda menggunakan penyandian yang tepat, tetapi jika Anda ingin menghapusnya maka cobalah:tr -d '\000'
sed 's/\000//g'
Untuk mengonversi file Anda ke format Unix / Linux sebelum pemrosesan apa pun, coba:
dos2unix filename
- rhel dan lainnyados2ux filename [newfilename]
- HP-UXsumber
Selain jawaban @ jrb, di Vim, pengkodean karakter file terdeteksi berdasarkan opsi fileencodings. (catat 's' di akhir fileencodings)
Yaitu pada Windows, nilai default untuk
fileencodings
opsi adalahucs-bom
, yang berarti:periksa apakah BOM ada di awal file.
Jika BOM ada, maka 'baca karakter pengkodean file keluar dari BOM'.
Jika BOM tidak ada (dan dalam hal ini juga berarti bahwa semua penyandian karakter yang ditentukan dalam
fileencodings
opsi gagal cocok), maka baca file dengan penyandian karakter yang ditentukan dalamencoding
opsi. Karakter pengkodean default untukencoding
pilihan adalah:latin1
. Sekarang, karenalatin1
adalah pengkodean karakter satu byte panjang, semua byte dalam file adalahlatin1
karakter yang valid (bahkanNul
karakter^@
yang Anda lihat *).* - sebenarnya,
^@
adalah karakter baris baru dalam teks buffer Vim, bukan karakter Nul.Cara yang tepat untuk membaca file adalah dengan menentukan pengkodean karakter secara manual sebagai UTF-16 (seperti UTF-16 adalah pengkodean karakter yang tepat dalam kasus ini).
sumber