1. 程式人生 > >vim 寫入錯誤,轉換失敗 (請將 'fenc' 置空以強制執行)

vim 寫入錯誤,轉換失敗 (請將 'fenc' 置空以強制執行)

vim裡面的編碼主要跟三個引數有關:enc(encoding), fenc(fileencoding)和fencs(fileencodings)  

其中fenc是當前檔案的編碼,也就是說,一個在vim裡面已經正確顯示了的檔案(前提是你的系統環境跟你的enc設定匹配),你可以通過改變 fenc後再w來將此檔案存成不同的編碼。比如說,我:set fenc=utf-8然後:w就把檔案存成utf-8的了,:set fenc=gb18030再:w就把檔案存成gb18030的了。這個值對於開啟檔案的時候是否能夠正確地解碼沒有任何關係。

fencs就是用來在開啟檔案的時候進行解碼的猜測列表。檔案編碼沒有百分百正確的判斷方法,所以vim只能猜測檔案編碼。比如我的vimrc裡面這個的設定是 set fileencodings=utf-8,gb18030,utf-16,big5 所以我的vim每開啟一個檔案,先嚐試用utf-8進行解碼,如果用utf-8解碼到了一半出錯(所謂出錯的意思是某個地方無法用utf-8正確地解碼),那麼就從頭來用gb18030重新嘗試解碼,如果gb18030又出錯(注意gb18030並不是像utf-8似的規則編碼,所以所謂的出錯只是說某個編碼沒有對應的有意義的字,比如0),就嘗試用utf-16,仍然出錯就嘗試用big5。這一趟下來,如果中間的某次解碼從頭到尾都沒有出錯,那麼 vim就認為這個檔案是這個編碼的,不會再進行後面的嘗試了。這個時候,fenc的值就會被設為vim最後採用的編碼值,可以用:set fenc?來檢視具體是什麼。 至於enc,其作用基本只是顯示。不管最後的檔案是什麼編碼的,vim都會將其轉換為當前系統編碼來進行處理,這樣才能在當前系統裡面正確地顯示出來,因此enc就是幹這個的。在windows下面,enc預設是cp936,這也就是中文windows的預設編碼,所以enc是不需要改的。在 linux下,隨著你的系統locale可能設為zh_CN.gb18030或者zh_CN.utf-8,你的enc要對應的設為gb18030或者 utf-8(或者gbk之類的)。 自己來總結一下吧: 1.如果系統的locale是zh_CN的,那麼想讓vim能顯示正確的編碼,在 .vimrc 中設定:  set enc=gbk set fencs=utf-8,gbk 這樣,vim會先探測utf-8的編碼,失敗了會作為gbk的編碼進行解碼。顯示當然是gbk了,這個和locale相關。 2.檢視當前檔案的編碼:  :set fenc 3.vim中轉換編碼: :set fenc=utf8 然後儲存即可。 4.如果已經打開了解碼錯的檔案,想重新設定編碼格式: :edit ++enc=utf8 5.shell轉換編碼: 將一個GBK 編碼的檔案轉換成UTF-8編碼 iconv -f gbk -t utf8 file1 -o file2 批量轉換檔案的編碼 : find . -name '*.txt' -exec iconv -f gbk -t utf8 {} -o tmp.txt \; -exec mv tmp.txt {} \; 注:開啟UTF-8編碼的檔案時,除了vim裡的設定,還需要正確SecureCRT,詳情請看我的另一篇文章《關於SecureCRT中的2箇中文問題》