Bagaimana saya bisa mengatur penyandian standar VIM ke UTF-8?

62

Saya ingin berkontribusi pada proyek sumber terbuka yang menyediakan string terjemahan. Salah satu persyaratan mereka adalah bahwa kontributor harus menggunakan UTF-8 sebagai pengkodean untuk file PO.

Saya menggunakan VIM 7.3 di Linux. Bagaimana saya bisa yakin bahwa penyandian VIM diatur ke UTF-8, sehingga saya dapat mengedit dan menyimpan file .po dengan cara yang benar?

Paolo
sumber

Jawaban:

64

Ketika Vim membaca file yang sudah ada, ia mencoba mendeteksi encoding file. Saat menulis file, Vim menggunakan pengkodean file yang terdeteksi (kecuali jika Anda memberi tahu secara berbeda). Jadi file yang terdeteksi sebagai UTF-8 ditulis sebagai UTF-8, file yang terdeteksi sebagai Latin-1 ditulis sebagai Latin-1, dan seterusnya.

Secara default, proses deteksi adalah kasar. Setiap file yang Anda buka dengan Vim akan dianggap Latin-1, kecuali jika mendeteksi tanda byte-order Unicode di bagian atas. File UTF-8 tanpa tanda byte-order akan sulit diedit karena setiap karakter multibyte akan ditampilkan dalam buffer sebagai urutan karakter alih-alih karakter tunggal.

Lebih buruk lagi, Vim, secara default, menggunakan Latin-1 untuk mewakili teks dalam buffer. Jadi file UTF-8 dengan tanda byte-order akan rusak oleh konversi ke Latin-1.

Solusinya adalah mengkonfigurasi Vim untuk menggunakan UTF-8 secara internal. Ini, pada kenyataannya, direkomendasikan dalam dokumentasi Vim, dan satu-satunya alasan ia tidak dikonfigurasikan dengan cara yang keluar dari kotak adalah untuk menghindari menciptakan kebingungan besar di antara pengguna yang mengharapkan Vim untuk beroperasi pada dasarnya sebagai editor Latin-1.

Di Anda .vimrc, tambahkan set encoding=utf-8dan mulai ulang Vim.

Atau sebaliknya, atur LANGvariabel lingkungan untuk menunjukkan bahwa UTF-8 adalah pengkodean karakter yang Anda sukai. Ini tidak hanya memengaruhi Vim tetapi juga perangkat lunak apa pun yang bergantung LANGuntuk menentukan bagaimana seharusnya mewakili teks. Misalnya, untuk menunjukkan bahwa teks akan muncul dalam bahasa Inggris ( en), seperti yang diucapkan di Amerika Serikat ( US), disandikan sebagai UTF-8 ( utf-8), atur LANG=en_US.utf-8.

Sekarang Vim akan menggunakan UTF-8 untuk mewakili teks dalam buffer. Plus, itu juga akan membuat upaya yang lebih bertekad untuk mendeteksi pengkodean UTF-8 dalam file. Selain mencari tanda byte-order, UTF-8 juga akan memeriksa tanpa tanda byte-byte sebelum kembali ke Latin-1. Jadi itu tidak akan lagi merusak file yang dikodekan dalam UTF-8, dan itu harus benar menampilkan karakter UTF-8 selama sesi pengeditan.

Untuk informasi lebih lanjut tentang bagaimana Vim mendeteksi encoding file, lihat yang fileencodingspilihan dalam dokumentasi Vim .

Untuk informasi lebih lanjut tentang pengaturan encoding yang Vim menggunakan internal, lihat itu encoding pilihan .

Jika Anda perlu mengganti pengkodean yang digunakan saat menulis file kembali ke disk, lihat itu fileencoding pilihan .

MetaEd
sumber
3
Sebenarnya sepertinya saya bahkan tidak perlu repot mengedit .vimrc; sebenarnya nilai default encoding adalah "latin1" atau nilai dari $ LANG, yang pada sistem saya diatur ke en_US.UTF-8. Untuk alasan ini :set encodingmemberi di encoding=utf-8luar kotak. Seperti yang diharapkan, jika LANG tidak disetel, :set encodingberi encoding=latin1. Terima kasih atas jawaban Anda!
Paolo
Itu mungkin secara umum berguna jadi saya telah menambahkannya ke jawabannya.
MetaEd
Jika Anda membuka file yang disandikan sebagai latin1, tidakkah pengaturan ini mengubah penyandian file? Bagaimana Anda bisa mendapatkan Vim agar penyandian file tetap utuh tetapi lebih suka utf-8 untuk file baru?
David Kennedy
@DaveKennedy Vim dapat memperlakukan file sebagai Latin-1 hanya ketika file tersebut jelas Latin-1. Ketika pengodeannya ambigu, Vim harus memilih. Misalnya, file yang hanya berisi kode ASCII 7-bit adalah Latin1 yang valid tetapi juga UTF-8 yang valid, dan lainnya. File seperti itu biasanya akan diperlakukan sebagai UTF-8. Salah satu cara untuk menghindari hasil ini adalah membuat penyandian file tidak ambigu. Trik yang saya lihat adalah menambahkan string kode 0xF7. Di UTF-8, 0xF7 tidak valid. Tetapi dalam bahasa Latin-1, itu mewakili tanda pembagian (÷). Vim biasanya akan menyimpulkan bahwa file tersebut adalah Latin-1.
MetaEd
4

Menurut vimdoc, vim mencoba mendeteksi secara otomatis penyandian file, jadi jika Anda mengedit file yang ada, Anda harus melakukannya dengan baik.

Anda selalu dapat memaksakan penyandian jika Anda mau :set fileencodings=utf-8. Anda dapat menemukan dokumentasinya di sini .

Tuan Shunz
sumber
6
fileencodings = utf-8 akan menyebabkan Vim mengenali file input sebagai UTF-8 tetapi kemudian melakukan konversi lossy ke Latin-1. Plus itu akan menyebabkan Vim gagal mengenali UTF-16. Solusi yang lebih baik adalah dengan mengatur encoding = utf-8 yang mengubah Vim dari editor satu byte asli menjadi editor multibyte asli.
MetaEd
@MetaEd dapatkah Anda menjawab ini untuk menguraikan komentar Anda :)
hhh