天天看點

VIM編碼vim的編碼詳解和中文環境設定

vim的編碼詳解和中文環境設定

本文按署名·非商業用途·保持一緻授權

作者: 

VIM編碼vim的編碼詳解和中文環境設定

 ,發表于2008年11月11日19時56分 

很慚愧,作為vim的忠實使用者,自從2年多前從help裡知道了:edit ++enc=xxx這個指令之後,我就沒有去了解過vim的編碼設定了。這些年來,我遇到編碼出錯,總是:edit ++enc=xxx。今天:help了一下encoding等,終于搞清楚了相關的各個變量的作用和關系。

簡單的說,有三個設定。(我下面基本以中文環境來作為說明)

1) 在.vimrc或者_vimrc裡加入set fileencodings=utf-8,gb2312,gbk,gb18030,big5這句就基本OK了。vim會依次使用這些編碼對檔案進行編碼的猜測。

2) 如果還是不行,那麼在打開檔案之後,用:edit ++enc=gbk這個指令強制使用某個編碼。

3) 如果依然不行,請檢查你的$LANG環境變量。

下面是詳細的說明。

vim編碼主要涉及三個變量。

encoding

vim的内部編碼,包括記憶體資料的編碼,vim配置檔案的編碼。encoding取自變量$LANG,如果$LANG為空,則取latin1。這個編碼應該和你的終端編碼保持一緻的。

fileencoding

檔案的編碼。vim在加載檔案的時候,會把這個編碼轉換成encoding參數的編碼。同樣的,儲存檔案的時候,記憶體的編碼會由encoding轉變為fileencoding。

需要注意的是,在vimrc裡設定這個參數,不會起作用。因為打開一個檔案的時候,fileencodings或者encoding會覆寫fileencoding。關于這個,可以看下面提到的打開檔案流程。

fileencodings=utf-8,gbk,gb2312

vim在加載一個檔案的時候,會依次嘗試使用fileencodings裡的編碼作為fileencoding。如果全部失敗,那麼vim會使用encoding作為fileencoding。

另外,如果vim使用了錯誤的編碼,可以使用edit ++enc=gbk這個指令。意思是,重新讀取檔案,并強制使用gbk作為fileencoding。這時候會忽略filencodings。

以下是一些vim操作的内部流程

打開檔案

首先從檔案讀入資料到記憶體,然後從fileencodings裡依次使用各個編碼來嘗試轉換為encoding。如果有一個成功,則中止嘗試。如果找不到,則取encoding作為fileencoding。也就是說,這裡有一個從fileencoding轉換為encoding的過程。

儲存檔案

把記憶體的資料,從encoding,轉換為fileencoding,然後寫入檔案。

其實在這裡最容易讓人搞不清楚的就是encoding和fileencoding的差別。因為在大多數GUI特别是WINDOWS平台的編輯器裡,encoding都是不需要設定的。通常這個encoding都是預設和GUI環境的編碼保持一緻。encoding是資料在記憶體裡的存儲編碼,而fileencoding才是檔案的編碼。

繼續閱讀