Khi Vim đọc một tệp hiện có, nó sẽ cố gắng phát hiện mã hóa tệp. Khi viết ra tệp, Vim sử dụng mã hóa tệp mà nó đã phát hiện (trừ khi bạn nói khác đi). Vì vậy, một tệp được phát hiện là UTF-8 được viết là UTF-8, một tệp được phát hiện là Latin-1 được viết là Latin-1, v.v.
Theo mặc định, quá trình phát hiện là thô. Mỗi tệp bạn mở bằng Vim sẽ được coi là Latin-1, trừ khi nó phát hiện dấu thứ tự byte Unicode ở trên cùng. Một tệp UTF-8 không có dấu thứ tự byte sẽ khó chỉnh sửa vì mọi ký tự đa nhân sẽ được hiển thị trong bộ đệm dưới dạng các chuỗi ký tự thay vì các ký tự đơn.
Tệ hơn, Vim, theo mặc định, sử dụng Latin-1 để thể hiện văn bản trong bộ đệm. Vì vậy, tệp UTF-8 có dấu thứ tự byte sẽ bị hỏng khi chuyển đổi xuống Latin-1.
Giải pháp là cấu hình Vim để sử dụng UTF-8 trong nội bộ. Trên thực tế, điều này được khuyến nghị trong tài liệu Vim và lý do duy nhất khiến nó không được cấu hình theo cách đó là để tránh tạo ra sự nhầm lẫn lớn giữa những người dùng mong đợi Vim hoạt động cơ bản như một trình soạn thảo Latin-1.
Trong của bạn .vimrc
, thêm set encoding=utf-8
và khởi động lại Vim.
Hoặc thay vào đó, hãy đặt LANG
biến môi trường để chỉ ra rằng UTF-8 là mã hóa ký tự ưa thích của bạn. Điều này sẽ ảnh hưởng đến không chỉ Vim mà bất kỳ phần mềm nào dựa vào LANG
để xác định cách nó sẽ thể hiện văn bản. Ví dụ: để chỉ ra rằng văn bản sẽ xuất hiện bằng tiếng Anh ( en
), như được nói ở Hoa Kỳ ( US
), được mã hóa dưới dạng UTF-8 ( utf-8
), được đặt LANG=en_US.utf-8
.
Bây giờ Vim sẽ sử dụng UTF-8 để thể hiện văn bản trong bộ đệm. Thêm vào đó, nó cũng sẽ nỗ lực quyết tâm hơn để phát hiện mã hóa UTF-8 trong một tệp. Bên cạnh việc tìm kiếm một thứ tự byte, nó cũng sẽ kiểm tra UTF-8 mà không có dấu thứ tự byte trước khi quay trở lại Latin-1. Vì vậy, nó sẽ không còn làm hỏng một tệp được mã hóa trong UTF-8 và nó sẽ hiển thị đúng các ký tự UTF-8 trong phiên chỉnh sửa.
Để biết thêm thông tin về cách Vim phát hiện mã hóa tập tin, xem các
fileencodings
tùy chọn trong tài liệu Vim .
Để biết thêm thông tin về cách thiết lập mã hóa mà Vim sử dụng nội bộ, xem các encoding
tùy chọn .
Nếu bạn cần phải ghi đè mã hoá được sử dụng khi viết một tập tin trở lại vào đĩa, xem các fileencoding
tùy chọn .
.vimrc
; trong thực tế, giá trị mặc định của mã hóa là "latin1" hoặc giá trị từ $ LANG, mà trên hệ thống của tôi được đặt thànhen_US.UTF-8
. Vì lý do này:set encoding
choencoding=utf-8
ra khỏi hộp. Như mong đợi, nếu LANG không được đặt,:set encoding
sẽ choencoding=latin1
. Cảm ơn câu trả lời tuyệt vời!