Vim menunjukkan karakter aneh <91>, <92>

26

Saat menggunakan Vim melalui SSH saya menyalin beberapa konten dari halaman web ke sesi SSH / Vim saya dan mendapatkan hasil berikut:

SIZE=`df -h|grep $DISC|awk <91>{print $2}<92>`

Tampaknya <91>dan <92>berdiri untuk 'tetapi bagaimana saya bisa mencari dan mengganti barang-barang ini? Dan apa yang 91/ 92artinya? Bagaimana ini disandikan karena 91/ 92dalam ASCII berarti \dan [?

Jeremy S.
sumber

Jawaban:

23

Konten pada halaman web sumber Anda diformat ulang secara berlebihan. Teks itu tidak diragukan lagi seharusnya menggunakan tanda kutip tunggal (lurus) (ASCII 39/0x27, U+0027) alih-alih tanda kutip tunggal keriting ( U+2018dan U+2019, yang ada 0x91 and 0x92di CP1252 (juga dikenal sebagai MS-ANSI dan WINDOWS-1252; pengodean 8-bit umum pada Windows)) .

Vim menunjukkan kepada Anda kode hex karena tidak valid dalam penyandian apa pun yang digunakan Vim (mungkin UTF-8). Jika Anda mengedit teks yang telah disimpan dalam file, maka Anda dapat memuat ulang file tersebut sebagai CP1252 dengan :e ++enc=cp1252; ini akan membuat kutipan keriting terlihat. Tetapi tidak ada alasan untuk reload sebagai CP1252, hanya menghapus 0x91dan 0x92karakter dan menggantinya dengan tanda kutip tunggal.

Chris Johnsen
sumber
Anda sering mendapatkan tanda kutip / tanda kutip dari konten yang disalin dari MS Word yang secara otomatis memasukkan tanda kutip / tanda kutip sebagai bagian dari fitur "Kutipan Cerdas". Jika font Anda tidak mendukung karakter tersebut, Anda hanya akan mendapatkan ruang kosong sebagai ganti karakter.
lambacck
1
+1 untuk:e ++enc=cp1252
wfaulk
@ ChrisJohnsen, Apakah ada cara untuk memanggil vi dengan bendera yang melakukan hal yang sama :e ++enc=cp1252? Jika saya ingin vi dari baris perintah file yang berisi karakter kata MS, akan lebih baik untuk dapat melakukannya dalam satu langkah, daripada membuka vi dan kemudian memuat file dengan :eperintah
Leo Simon
@LeoSimon: vim --cmd 'set fileencodings=cp1252' /path/to/file- Perintah berjalan sebelum normal .vimrcdan menetapkan fileencodingsopsi (perhatikan akhir s; Anda juga dapat menggunakan nama yang lebih pendek fencs) sehingga Vim hanya akan mencoba CP1252 saat memuat file. Ini seharusnya berfungsi untuk pengeditan sekali-kali dari file-file seperti itu, tetapi ini dapat menyebabkan komplikasi jika Anda ingin menggunakan instance Vim untuk mengedit file dengan pengkodean lainnya.
Chris Johnsen
Terima kasih !, untuk menjadi eksplisit, saya sekarang menggunakanvim -c"set fencs" /path/to/file
Leo Simon
27

91 dan 92 adalah kode hex untuk membuka dan menutup tanda kutip keriting (kutipan tunggal) dalam versi MS Windows default dari pengkodean latin1 / ISO-8859-1, yang lebih khusus disebut cp1252 / Windows-1252 (di mana cp adalah singkatan dari kode halaman).

Karakter-karakter ini paling sering disisipkan oleh orang yang menyalin konten dari dokumen Word / email Outlook sebagai bagian dari fitur "Kutipan Cerdas". Karakter masalah lain dalam halaman kode ini adalah hex 93/94 yang membuka dan menutup tanda kutip ganda, titik peluru (•) dan ligatur OE (œ dan Œ). Anda dapat melihat daftar lengkap "karakter bermasalah", karakter yang tidak memetakan langsung ke ISO-8859-1 atau UTF-8 dengan kode yang sama, pada halaman Wikipeda untuk cp1252 disorot dengan warna hijau.

Jika semua yang Anda inginkan adalah membuka file dalam pengkodean yang benar maka gunakan opsi ++ enc = cp1252 ke perintah: e:

:e ++enc=1252 filename.txt

Anda dapat mengganti kode hex buruk tertentu di Vim dengan perintah pengganti (: s) dan salah satu pengganti kode:

\d123   decimal number of character
\o40    octal number of character up to 0377
\x20    hexadecimal number of character up to 0xff
\u20AC  hex. number of multibyte character up to 0xffff
\U1234  hex. number of multibyte character up to 0xffffffff

Untuk mengubah hex 91/92 karakter yang perlu Anda lakukan:

:%s/[\x91\x92]/'/g
lambacck
sumber
Akan lebih baik memiliki perintah bash untuk mengganti karakter-karakter tersebut di semua file dalam direktori. Saya datang dengan ini dari pencarian google cepat, sed -i "s/[\x91\x92]/\'/g" *.txttetapi tidak berhasil.
Buttle Butkus
Saya baru saja menemukan sesuatu yang sepertinya berfungsi untuk baris perintah. Ini menemukan / mengganti semua file .txt di folder saat ini. Tapi coba riset perl sebelum menggunakan ini, karena saya tidak tahu apa yang dilakukan switch. perl -p -i -e "s/[\x91\x92]/'/g" *.txt
Buttle Butkus
2
sed -i "s/\x92/'/g"bekerja untukku.
Karoly Horvath
3

Gunakan iconvuntuk mengonversi file teks dari CP1252 ke UTF-8 sebelum membuka.

iconv -f cp1252 -t utf8 inputfile.csv > outputfile.csv

Di Mac OS gunakan ini:

iconv -f cp1252 -t UTF8-MAC inputfile.csv  > outputfile.csv
Ignacio Vazquez-Abrams
sumber
-3

Mereka sebenarnya berdiri untuk hex 91 dan 92, yang dalam codepage Windows membuka dan menutup tanda kutip tunggal ('dan' - Alt-0145 dan Alt-0146).

Coba cari / ganti berikut ini:

:s%/\<9[12]\>/'/g
Alex
sumber
1
Saya tidak bisa mengundurkan diri karena kekurangan poin, tetapi perintah substitusi ini sangat salah. Saya tidak tahu harus mulai dari mana :(
lambacck
1
Ini tidak berfungsi untuk saya: stackoverflow.com/questions/2798398/… memberikan solusi yang berfungsi.
Kebingungan
@ lambacck: Saya berasumsi bahwa file tersebut berisi string literal "91" dan "92", dan dalam hal ini perintah ini benar. Jika ini adalah karakter hex, maka Anda benar, Anda akan memerlukan perintah substitusi atau yang serupa.
Alex