版權聲明:轉載時請以超鏈接形式標明文章原始出處和作者信息及本聲明
http://kubuntu.blogbus.com/logs/35794965.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環境變量中的目錄裏。