Bagaimana cara menemukan penyandian buffer saat ini di vim?

89

Katakanlah saya mengedit beberapa file dengan vim (atau gvim). Saya tidak tahu tentang penyandian file dan saya ingin tahu apakah itu dalam UTF-8 atau ISO-8859-1 atau apa pun? Dapatkah saya entah bagaimana memberitahu vim untuk menunjukkan kepada saya encoding apa yang digunakan?

innaM
sumber

Jawaban:

104

Pengaturan fileencoding menunjukkan penyandian buffer saat ini:

:set fileencoding
fileencoding=utf8

Sebenarnya tidak ada cara umum untuk menentukan pengodean file plaintext, karena informasi itu tidak disimpan dalam file itu sendiri - kecuali File UTF-8 di mana Anda memiliki BOM yang disebut yang menunjukkan Pengodean. Inilah sebabnya mengapa file xml dan html memiliki metatag charset.

Anda dapat menerapkan pengkodean tertentu dengan pengaturan 'pengodean'. Lihat :help encodingdan :help fileencodingdi Vim untuk bagaimana editor menangani pengaturan ini. Anda juga dapat menambahkan beberapa pengaturan fileencoding ke vimrc Anda agar vim mencoba mendeteksi berdasarkan yang terdaftar.

jtimberman
sumber
1
Sempurna. Bahkan jika agak kontra intuitif. Terima kasih!
innaM
7
Sayangnya, tidak benar. Untuk Vim tidak dapat menemukan penyandian file yang sedang Anda baca. Itu tidak ditulis dalam file. Itu hanya dapat menebak berdasarkan karakter yang tersedia dalam file. Misalnya file dengan teks "abcdef" bisa dalam beberapa penyandian, karena praktis semua mendukung karakter tersebut, tetapi file dengan "šđčćž" kemungkinan akan berada di CP1252. Jadi, Anda tidak membaca pengkodean dari suatu tempat, tetapi menebak apa itu pengkodean, dan berdasarkan yang menampilkannya dengan benar.
Benteng
6
Apa yang Anda lakukan di sini secara eksplisit mengatur pengkodean, berdasarkan pengamatan Anda terhadap isi file. Jika Anda ingin vim mencoba beberapa penyandian, saat membuka file, masukkan beberapa di antaranya dalam opsi _vimrc Anda.
Benteng
@ldigas, terima kasih untuk umpan balik, saya telah memperbarui jawaban untuk menjadi sedikit lebih jelas tentang itu (saya harap!)
jtimberman
2
Mungkin perlu disebutkan bahwa BOM adalah 1.) Tidak unik untuk UTF-8 - meskipun UTF-8 berbeda dari BOM lain, 2.) Tidak diperlukan dan sering tidak ditemukan di UTF-8 .
ruffin
13

Perhatikan bahwa penyandian file tidak secara eksplisit dinyatakan di mana pun dalam file. Dengan demikian, VIM dan aplikasi lain harus menebak pada pengkodean. Cara kanonik melakukan ini adalah dengan chardetaplikasi, yang dapat dijalankan dari dalam VIM seperti:

:!chardet %

Jawaban yang diberikan oleh jtimberman menunjukkan kepada Anda pengkodean buffer saat ini yang mungkin bukan pengkodean yang sama dengan file pada disk. Dengan demikian, Anda akan melihat bahwa chardetkadang-kadang akan menunjukkan pengkodean yang berbeda dari VIM, terutama jika Anda memiliki VIM yang dikonfigurasi untuk selalu menggunakan pengkodean tertentu (yaitu UTF-8).

Yang menyenangkan tentang itu chardetadalah memberikan skor kepercayaan untuk tebakannya, sedangkan VIM bisa (dan sering) salah menebak menebak pengkodean jika tidak banyak karakter di atas \ x7F (ASCII 127). Misalnya, menambahkan satu אke file panjang kode PHP membuat chardetberpikir bahwa file tersebut ISO-8859-2dengan kepercayaan 0,72, sedangkan menambahkan frase yang sedikit lebih panjang שלום, עולם!‏memberi UTF-8 dengan skor kepercayaan 0,99. Dalam kedua kasus, set fileencoding?menunjukkan UTF-8bukan karena file pada disk adalah UTF-8, tetapi karena VIM dikonfigurasi untuk menggunakan UTF-8 secara internal.

dotancohen
sumber
Saya sarankan Anda menyebutkan sepatah kata pun tentang ketersediaan chardet di seluruh OS'es.
Soundararajan
@ Soundararajan: Saya mungkin bukan orang itu karena saya hanya menggunakan Debian dan CentOS. Anda diundang untuk mengedit jawaban jika Anda memiliki informasi yang relevan. Terima kasih!
dotancohen
Saya tidak melihat kebutuhan untuk melakukan itu di dalam VIM, lebih baik untuk melakukannya dari luar: chardet <file>. Tetap saja, saran yang bagus.
lepe
-1

Saya menemukan bahwa: https://vim.fandom.com/wiki/Reloading_a_file_using_a_different_encoding

Anda dapat memuat ulang file menggunakan penyandian berbeda jika Vim tidak dapat mendeteksi penyandian yang benar:

:e ++enc=<encoding>

dimana encodingbisacp850, ISO-8859-1, UTF-8, ...

Anda dapat menggunakan file yourfilenameuntuk menemukan penyandian atau chardetect(disediakan oleh python-chardetatau uchardetbergantung pada distribusi Linux Anda) seperti yang disarankan oleh dotancohen.

Pierre-Damien
sumber
Ini tidak menjawab pertanyaan tentang bagaimana mengetahui pengkodean saat ini. Sebaliknya perintah ini akan memaksa beberapa pengkodean lainnya pada buffer.
Ruslan