Bagaimana saya bisa mengubah penyandian file dengan vim?

235

Saya terbiasa menggunakan vim untuk memodifikasi akhir baris file:

$ file file
file: ASCII text, with CRLF line terminators
$ vim file
:set ff=mac
:wq
$ file file
file: ASCII text, with CR line terminators

Apakah mungkin menggunakan proses serupa untuk mengubah pengkodean unicode file? Saya mencoba yang berikut, yang tidak berfungsi:

$ file file.xml
file.xml: Unicode text, UTF-16, little-endian
$ vim file
:set encoding=utf-8
:wq
$ file file.xml
file.xml: Unicode text, UTF-16, little-endian

Saya melihat seseorang mengatakan bahwa dia dapat "mengatur fileencoding = utf-8, kemudian memperbarui dan menulis file, dan itu berfungsi," tetapi saya sepertinya kehilangan sesuatu, atau dia bingung. Saya tidak tahu apa yang dia maksud dengan "lalu perbarui."

skiphoppy
sumber

Jawaban:

163

Perhatikan bahwa ada perbedaan di antara keduanya

atur pengodean

dan

atur fileencoding

Dalam kasus pertama, Anda akan mengubah pengkodean keluaran yang ditampilkan di terminal. Dalam kasus kedua, Anda akan mengubah pengkodean output dari file yang ditulis.

Johan
sumber
1
Terima kasih! Apache mengeluarkan utf-8, begitu juga php, begitu peramban berkata, begitu kata vim dengan set encoding, dan masih halaman-halamannya menunjukkan karakter-karakter yang rusak yang tidak masalah seperti iso-8859-1. menggunakan set fileencodingmenunjukkan cukup 'Latin1'
Adriano Varoli Piazza
77

Meskipun menggunakan vim untuk melakukannya sangat mungkin, mengapa Anda tidak menggunakan ikonv saja? Maksud saya - memuat editor teks hanya untuk melakukan konversi pengkodean sepertinya menggunakan palu yang terlalu besar untuk paku yang terlalu kecil.

Hanya:

iconv -f utf-16 -t utf-8 file.xml > file.utf8.xml

Dan kamu sudah selesai.


sumber
19
Kekurangannya, iconv mungkin tidak mudah tersedia di Windows.
Adriano Varoli Piazza
2
@AdrianoVaroliPiazza tidak vim.
1
Saya akan mengatakan beberapa unduhan "instal saja", bahkan dengan edisi portabel "merupakan" mudah tersedia "
Adriano Varoli Piazza
2
@ adriano-varoli-piazza Tidak, iconv tersedia di Windows dengan Cygwin dan MingW, seperti yang dicatat oleh @ coder-tim.
t0r0X
1
@mario Tidak, Vim sangat mudah tersedia di Windows: vim.org/download.php#pc
t0r0X
52

Sama seperti langkah Anda, pengaturan fileencoding harus bekerja Namun, saya ingin menambahkan satu "set bom" untuk membantu editor menganggap file sebagai UTF8.

$ vim file
:set bomb
:set fileencoding=utf-8
:wq
Francis
sumber
8
Terima kasih atas jawaban Anda, itu membuat saya mempelajari lebih lanjut tentang tanda pesanan byte UTF. Namun FYI, pengaturan BOM tampaknya tidak perlu / tidak disarankan untuk UTF-8 karena itu bukan format panjang byte tetap seperti 16 atau 32. Lihat di sini untuk penjelasan dan referensi. Ini bukan masalah (dan bahkan membantu) untuk vim, saya hanya berpikir orang harus sadar bahwa itu dapat menyebabkan masalah kompatibilitas di tempat lain.
joelhardi
2
Apakah itu bombatau bomdapatkah itu terjadi unset? EDIT : Ya, Anda bisa menghapusnya via set nobomb.
icedwater
6
Ya, saya mengatur kami bomb(dengan ab).
ruffin
per dokumen, :set bombdihidupkan jika :set fenc=utf-8.. lihat:he bomb
Evan Carroll
12
semua pengkodean basis kami sekarang menjadi milik UTF-8
roblogic
6

Mungkin bermanfaat untuk mengubah penyandian hanya pada baris perintah sebelum file dibaca:

rem On MicroSoft Windows
vim --cmd "set encoding=utf-8" file.ext
# In *nix shell
vim --cmd 'set encoding=utf-8' file.ext

Lihat mulai ,--cmd .

Hans Ginzel
sumber
3
Variasi pertama juga harus bekerja pada shell * nix. 'single quotes'hanya diperlukan untuk melarikan diri semua karakter meta, yang biasanya bukan yang Anda inginkan.
jpaugh