轉自:http://www.cnblogs.com/yongtan/archive/2011/09/21/2183014.html
貌似之前就有遇到過在windows系統下vim出現中文亂碼的情況,只是用得較少而且也懶得去搗鼓它/// 這問題直到昨晚因為試用了個Caspatant同學介紹的一款用於實現twitter用戶端功能Vim外掛程式---TwitVim的時候查看訊息的時候出現的根本都是亂碼。。。所以決定搞定關於Vim編輯器編碼方式導致中文亂碼的問題///
上網瞭解了下才知道原來Vim有四個跟字元編碼方式有關的選項,分別是:encoding、fileencoding、fileencodings、 termencoding (這些選項可能的取值請參考 Vim 線上協助 :help encoding-names),它們各自的意義:
* encoding: Vim 內部使用的字元編碼方式,包括 Vim 的 buffer (緩衝區)、菜單文本、訊息文本等。使用者手冊上建議只在 .vimrc 中改變它的值,事實上似乎也只有在 .vimrc 中改變它的值才有意義。
* fileencoding: Vim 中當前編輯的檔案的字元編碼方式,Vim 儲存檔案時也會將檔案儲存為這種字元編碼方式 (不管是否新檔案都如此)。
* fileencodings: Vim 啟動時會按照它所列出的字元編碼方式逐一探測即將開啟的檔案的字元編碼方式,並且將 fileencoding 設定為最終探測到的字元編碼方式。因此最好將 Unicode 編碼方式放到這個列表的最前面,將拉丁語系編碼方式 latin1 放到最後面。
* termencoding: Vim 所工作的終端 (或者 Windows 的 Console 視窗) 的字元編碼方式。這個選項在 Windows 下對我們常用的 GUI 模式的 gVim 無效,而對 Console 模式的 Vim 而言就是 Windows 控制台的字碼頁,並且通常我們不需要改變它。
由於 Unicode 能夠包含幾乎所有的語言的字元,Unicode的 UTF-8 編碼方式又是非常具有性價比的編碼方式,因此encoding 的值設定為utf-8。同時將encoding設定為utf-8時,Vim自動探測檔案的編碼方式會更準確。在中文 Windows裡編輯的檔案,為了兼顧與其他軟體的相容性,檔案編碼還是設定為GB2312/GBK比較合適,因此fileencoding建議設定為 chinese (chinese 是個別名,在Unix裡表示gb2312,在Windows裡表示cp936,也就是GBK的字碼頁)。
最終對於檔案中顯示亂碼、菜單亂碼、右鍵菜單亂碼以及Conlse輸出亂碼問題的解決方案,修改Vim編輯器所對應的設定檔_vimrc,添加如下配置:
"處理文本中顯示亂碼
set encoding=utf-8
set fileencodings=utf-8,chinese,latin-1
if has("win32")
set fileencoding=chinese
else
set fileencoding=utf-8
endif
"處理菜單及右鍵菜單亂碼
source $VIMRUNTIME/delmenu.vim
source $VIMRUNTIME/menu.vim
"處理consle輸出亂碼
language messages zh_CN.utf-8
關於Vim的支援多字元編碼方式工作的運作原理是:
首先、Vim 啟動,根據_vimrc設定檔中設定的encoding的值來設定buffer、菜單文本、訊息文的字元編碼方式。
緊接、讀取要編輯的檔案,根據fileencodings中列出的字元編碼方式逐一探測該檔案編碼方式。並設定fileencoding 為探測到的字元編碼方式。
然後、對比fileencoding和encoding的值,若不同則調用iconv將檔案內容轉換為encoding所描述的字元編碼方式,並且把轉換後的內容放到為此檔案開闢的buffer裡,完成後就可以開始編輯這個檔案。
最後、編輯完成後儲存檔案時,再次對比fileencoding和encoding的值。若不同再次調用iconv將即將儲存的buffer中的文本轉換為fileencoding所描述的字元編碼方式,並儲存到指定的檔案中。
註:需要調用外部的iconv.dll,需要保證這個檔案存在於$VIMRUNTIME或者其他列在PATH環境變數中的目錄裡。