Làm cách nào tôi có thể đặt mã hóa mặc định của VIM thành UTF-8?


62

Tôi muốn đóng góp cho một dự án nguồn mở cung cấp các chuỗi dịch. Một trong những yêu cầu của họ là những người đóng góp phải sử dụng UTF-8 làm mã hóa cho các tệp PO.

Tôi đang sử dụng VIM 7.3 trên Linux. Làm cách nào tôi có thể chắc chắn rằng mã hóa của VIM được đặt thành UTF-8, để tôi có thể chỉnh sửa và lưu tệp .po đúng cách?

Câu trả lời:


64

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 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-8và khởi động lại Vim.

Hoặc thay vào đó, hãy đặt LANGbiế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 fileencodingstù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 .


3
Trên thực tế có vẻ như tôi thậm chí không phải bận tâm chỉnh sửa .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ành en_US.UTF-8. Vì lý do này :set encodingcho encoding=utf-8ra khỏi hộp. Như mong đợi, nếu LANG không được đặt, :set encodingsẽ cho encoding=latin1. Cảm ơn câu trả lời tuyệt vời!
Paolo

Điều đó thường có thể hữu ích vì vậy tôi đã thêm nó vào câu trả lời.
MetaEd

Nếu bạn mở một tệp được mã hóa thành latin1, cài đặt này có thay đổi mã hóa tệp không? Làm thế nào bạn có thể có được Vim để giữ nguyên mã hóa của một tệp nhưng thích utf-8 cho các tệp mới?
David Kennedy

@DaveKennedy Vim chỉ có thể coi tệp là Latin-1 khi tệp rõ ràng là Latin-1. Khi mã hóa không rõ ràng, Vim phải chọn. Ví dụ: một tệp chỉ chứa mã ASCII 7 bit là hợp lệ Latin1 nhưng nó cũng hợp lệ UTF-8 và các tệp khác. Một tệp như vậy thường sẽ được coi là UTF-8. Một cách để tránh kết quả này là làm cho mã hóa tệp không rõ ràng. Thủ thuật tôi đã thấy là thêm một chuỗi mã 0xF7. Trong UTF-8, 0xF7 không hợp lệ. Nhưng trong tiếng Latin-1, nó đại diện cho dấu hiệu phân chia (÷). Vim thường sẽ kết luận rằng tệp là Latin-1.
MetaEd

4

Theo vimdoc vim cố gắng tự động phát hiện mã hóa tệp, vì vậy nếu bạn chỉnh sửa các tệp hiện có, bạn sẽ thấy tốt.

Bạn luôn có thể buộc mã hóa nếu bạn muốn :set fileencodings=utf-8. Bạn có thể tìm thấy các tài liệu ở đây .


6
fileencodings = utf-8 sẽ khiến Vim nhận ra tệp đầu vào là UTF-8 nhưng sau đó thực hiện chuyển đổi mất thành Latin-1. Thêm vào đó, nó sẽ khiến Vim không thể nhận ra UTF-16. Giải pháp tốt hơn là đặt mã hóa = utf-8, biến Vim từ trình soạn thảo một byte gốc thành trình soạn thảo đa lõi riêng.
MetaEd

@MetaEd bạn có thể trả lời câu hỏi này để giải thích về nhận xét của bạn không :)
hhh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.