Làm cách nào để tìm mã hóa bộ đệm hiện tại trong vim?


89

Nói rằng tôi đang chỉnh sửa một số tệp với vim (hoặc gvim). Tôi không biết gì về mã hóa của tập tin và tôi muốn biết liệu nó có trong UTF-8 hay ISO-8859-1 hay không? Tôi có thể bằng cách nào đó nói với vim để cho tôi biết mã hóa nào được sử dụng?

Câu trả lời:


104

Cài đặt mã hóa tệp hiển thị mã hóa bộ đệm hiện tại:

:set fileencoding
fileencoding=utf8

Thực sự không có cách phổ biến nào để xác định mã hóa của tệp văn bản gốc, vì thông tin đó không được lưu trong chính tệp đó - ngoại trừ Tệp UTF-8 nơi bạn có một BOM được gọi là Mã hóa. Đây là lý do tại sao các tệp xml và html có siêu dữ liệu bảng mã.

Bạn có thể thực thi một mã hóa cụ thể với cài đặt 'mã hóa'. Xem :help encoding:help fileencodingtrong Vim để biết cách trình soạn thảo xử lý các cài đặt này. Bạn cũng có thể thêm một số cài đặt mã hóa tệp vào vimrc của mình để vim thử phát hiện dựa trên các cài đặt được liệt kê.


1
Hoàn hảo. Ngay cả khi phần nào phản trực giác. Cảm ơn bạn!
innaM

7
Đáng tiếc, không đúng. Đối với Vim không thể tìm thấy mã hóa của tệp bạn đang đọc. Nó không được ghi trong tập tin. Nó chỉ có thể đoán dựa trên các ký tự có sẵn trong tệp. Ví dụ, một tệp có văn bản "abcdef" có thể được mã hóa trong một số mã, vì thực tế tất cả đều hỗ trợ các ký tự đó, nhưng một tệp có "šđčćž" có thể sẽ nằm trong CP1252. Vì vậy, bạn không đọc mã hóa từ một nơi nào đó, nhưng đoán xem mã hóa đó có thể là gì, và dựa trên việc hiển thị nó đúng cách.
Rook

6
Những gì bạn đang làm ở đây là cài đặt mã hóa một cách rõ ràng , dựa trên những quan sát của bạn về nội dung của tệp. Nếu bạn muốn vim thử một vài mã hóa, khi mở một tệp, hãy đặt một vài trong số chúng vào tùy chọn trong _vimrc của bạn.
Rook

@ldigas, cảm ơn bạn đã phản hồi, tôi đã cập nhật câu trả lời để rõ ràng hơn một chút về điều đó (tôi hy vọng!)
jtimberman

2
Có lẽ đáng nói là các BOM là 1.) Không phải là duy nhất đối với UTF-8 - mặc dù UTF-8 khác với các BOM khác, 2.) Không bắt buộc và thường không được tìm thấy trong UTF-8 .
ruffin

13

Lưu ý rằng mã hóa của tệp không được nêu rõ ràng ở bất kỳ đâu trong tệp. Do đó, VIM và các ứng dụng khác phải đoán mã hóa. Cách thức hợp quy để thực hiện việc này là với chardetứng dụng, có thể được chạy từ bên trong VIM như sau:

:!chardet %

Câu trả lời được cung cấp bởi jtimberman cho bạn thấy mã hóa của bộ đệm hiện tại có thể không phải là mã hóa giống như tệp trên đĩa. Do đó, bạn sẽ nhận thấy rằng chardetđôi khi sẽ hiển thị một mã hóa khác với VIM, đặc biệt nếu bạn đã cấu hình VIM để luôn sử dụng một mã hóa cụ thể (ví dụ UTF-8).

Điều thú vị chardetlà nó mang lại điểm tin cậy cho dự đoán của nó, trong khi VIM có thể (và thường là) sai về việc đoán mã hóa nếu không có nhiều ký tự trên \ x7F (ASCII 127). Chẳng hạn, việc thêm một אtập tin vào một đoạn mã PHP dài khiến người ta chardetnghĩ rằng tập tin đó ISO-8859-2có độ tin cậy là 0,72, trong khi việc thêm cụm từ dài hơn một chút שלום, עולם!‏sẽ cho UTF-8 với điểm tin cậy là 0,99. Trong cả hai trường hợp, set fileencoding?cho thấy UTF-8không phải vì tệp trên đĩa là UTF-8, mà vì VIM được cấu hình để sử dụng UTF-8 trong nội bộ.


Tôi đề nghị bạn nên đề cập đến một từ về tính khả dụng của chardet trên các hệ điều hành.
Soundararajan

@Soundararajan: Có lẽ tôi không phải là người đề cập đến điều đó khi tôi chỉ sử dụng Debian và CentOS. Tuy nhiên, bạn được mời chỉnh sửa câu trả lời nếu bạn có thông tin liên quan. Cảm ơn!
dotancohen

Tôi không thấy sự cần thiết phải làm điều đó trong VIM, tốt hơn là làm điều đó từ bên ngoài : chardet <file>. Tuy nhiên, đề nghị tốt.
Lepe

-1

Tôi thấy rằng: https://vim.fandom.com/wiki/Reloading_a_file_USE_a_different_encoding

Bạn có thể tải lại một tệp bằng mã hóa khác nếu Vim không thể phát hiện mã hóa chính xác:

:e ++enc=<encoding>

nơi encodingcó thểcp850, ISO-8859-1, UTF-8, ...

Bạn có thể sử dụng file yourfilenameđể tìm mã hóa hoặc chardetect(được cung cấp bởi python-chardethoặc uchardettùy thuộc vào bản phân phối Linux của bạn) theo đề xuất của dotancohen.


Điều này không trả lời câu hỏi làm thế nào để tìm ra mã hóa hiện tại. Thay vào đó, lệnh này sẽ buộc một số mã hóa khác trên bộ đệm.
Ruslan
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.