題 如何在vim中找到當前緩衝區的編碼?


假設我正在用vim(或gvim)編輯一些文件。我不知道文件的編碼,我想知道它是UTF-8還是ISO-8859-1或其他什麼?我可以告訴vim告訴我使用了什麼編碼嗎?


81
2017-08-24 13:48


起源




答案:


fileencoding設置顯示當前緩衝區的編碼:

:set fileencoding
fileencoding=utf8

確實沒有一種常用的方法來確定明文文件的編碼,因為該信息不會保存在文件本身中 - 除了UTF-8文件,你有一個所謂的BOM表示編碼。這就是xml和html文件具有charset元標記的原因。

您可以使用“編碼”設置強制執行特定編碼。看到 :help encoding 和 :help fileencoding 在Vim中,編輯器如何處理這些設置。您還可以向vimrc添加幾個fileencoding設置,讓vim嘗試根據列出的設置進行檢測。


92
2017-08-24 13:52



完善。即使有點反直覺。謝謝! - innaM
不幸的是,不正確。對於Vim不能 找 您正在閱讀的文件的編碼。它不是寫在文件中。它只能根據文件中的可用字符進行猜測。例如,帶有文本“abcdef”的文件可以使用多種編碼,因為幾乎所有文件都支持這些字符,但帶有“šđčćž”的文件可能會出現在CP1252中。所以,你不是從某個地方讀取編碼,而是猜測它可能是什麼編碼,並基於正確顯示它。 - Rook
你在這裡做的是明確的 設置 編碼,基於您對文件內容的觀察。如果你希望vim嘗試多種編碼,在打開文件時,將其中的幾個放在_vimrc中的選項中。 - Rook
@ldigas,感謝您的反饋,我已經更新了答案,以便更清楚一點(我希望!) - jtimberman
可能值得一提的是BOM是1.) 並非UTF-8獨有  - 雖然UTF-8與其他BOM不同,但是) 不需要,通常在UTF-8中找不到。 - ruffin


請注意文件的編碼是 沒有明確說明 文件中的任何位置。因此,VIM和其他應用程序必須猜測編碼。這樣做的規範方法是使用 chardet 應用程序,可以在VIM中運行,如下所示:

:!chardet %

jtimberman提供的答案向您展示了編碼 當前緩衝區 它可能與磁盤上的文件編碼不同。因此,你會注意到 chardet 有時會顯示與VIM不同的編碼,特別是如果您將VIM配置為始終使用特定編碼(即UTF-8)。

好的事情 chardet 是它給出了它的猜測的置信度分數,而如果在\ x7F(ASCII 127)之上沒有多個字符,VIM可能(通常是)猜測編碼是錯誤的。例如,添加一個 א 到一個長文件的PHP代碼使 chardet 認為文件是 ISO-8859-2 置信度為0.72,而添加稍長的短語 שלום, עולם!‏ 給UTF-8的置信度得分為​​0.99。在這兩種情況下, set fileencoding? 顯示 UTF-8 不是因為磁盤上的文件是UTF-8,而是因為VIM配置為在內部使用UTF-8。


12
2017-12-26 06:59



我建議你提一下關於OS'es中chardet的可用性。 - Soundararajan
@Soundararajan:我可能不會提到這個,因為我只使用Debian和CentOS。但是,如果您有相關信息,則會邀請您編輯答案。謝謝! - dotancohen