linux下基於vim的文件編碼

掙扎後,我們還是向gbk妥協了,三個項目都將基於gb編碼,我想,將來我一定會非常懷念使用utf8的年代的。其實,如果熟悉這些編碼之間的關係,多關注下開發時候的文件編碼,大概也不會出現亂碼和ajax前後編碼解碼的問題,只是總會有人某個時刻忘了將文件另存爲gb編碼的文件,也總會有人在開發的爽的時候忘了這個根本,既然統一編碼,在winodw下的前端開發都要將文件存爲gbk,在editplus或記事本中存爲ANSI編碼就可以,這些編輯器會根據碼流去識別到底是gbk還是gb2312還是gb18030的編碼,至少gb系的編碼有一部分是相互兼容的,碼流有很大重合的空間,所以 window下很多文本編輯器都沒有強行採用某種特定的編碼。在linux下就不這麼簡單了,使用vim的時候要很小心纔行

先來說說這些編碼,gb2312是在ascII基礎上擴展得到的,後來又擴充了gbk和gb18030,其中最新版的gb18030是05年才release出來,在常用簡體中文字上,三種編碼是完全兼容的,只是新的標準增加了很多生僻字、偏旁部首和繁體字。unicode是和ascII完全不同的一套編碼方案,utf8就是基於這種方案的一種編碼,utf8包含有除中文外的其他多國語言,適合全球使用,所以utf8的體積要比gb系的字符集合大很多,但在中文字方面,和gb18030相當,其編碼和gb系完全不兼容。在linux下,如果沒有配置.vimrc中的fileencoding,vim將會採用系統默認編碼來讀寫文件,還是應當在.vimrc中定義編碼種類,我的vimrc是這樣定義的:

set fileencodings=ucs-bom,utf-8,GB18030,gbk

ucs- bom是unicode編碼的一種,類似utf8,將其和utf8放在最前面是因爲,vim在試圖用ucs-bom或utf-8來讀文件的時候,如果發現錯誤則選用後續編碼來讀文件,而vim卻不能根據gbk和gb18030進行錯誤識別。沒有gb2312?因爲在vimrc中設置gb2312根本沒用。基於這個設置,來操作下;

linux下vim一個空文件,這時肯定是utf8的編碼,輸入“中文”兩個字,保存爲11.utf8,用file命令查看這個文件,提示是utf8的unicode文件,沒有問題。

再 vim一個11.gb18030,也是輸入“中文”兩字,設置編碼:set fileencoding=gb18030,保存文件名爲22.gb18030退出,用file查看文件,提示是ISO-8859文件,並沒有提示是 gb18030,實際上file命令只能根據碼流判斷編碼方法,而gbk,gb2312和gb18030碼流在簡體中文範圍是一致的,因此也判斷不出是什麼字符集,而utf8編碼則屬於確定的字符集,所以從碼流的模樣上看是看不出gbk、gb2312和gb18030文件的。同樣,vim一個文件,輸入 “中文”二字,set fileencoding=gbk,保存退出,也是一樣,只是set命令執行後編輯器會顯示文件編碼爲cp936,不用管它,cp936是gbk的別名。

同樣的,vim一個文件,set fileencoding=gb2312,編輯器會顯示euc-cn,如圖

但當第二次打開gb*編碼的文件的時候,vim所識別的字符集和當初設定的字符集卻不一樣,比如打開22.gb18030、33.gbk和 44.gb2312的時候,vim統統將其識別爲gb18030。vim這樣做大概是爲了兼容考慮。那麼一個設定了gb2312字符集編碼的文件,能否往裏寫非gb2312的字符呢?例如我新建一個vim文件,set fileencoding=gb2312,然後輸入“中文兀”這三個字,其中“兀”是非gb2312字符(gb2312所有字符在這裏查找),再保存,出錯:“寫入錯誤,轉換失敗”,強制保存也不行,

只有將set fileencoding=gbk或者gb18030,才能成功保存,但是保存之前會有提示,強制保存後會出現“已轉換”字樣,似乎中間有一個“編碼轉換”的過程。

同樣,在重新打開一個剛纔set fileencoding=gb2312的文件,輸入那個”兀”字再保存也會出現”已轉換”,似乎也經過了一個“編碼轉換”的過程,只是和上個例子相比沒有出現嚴重提示而已,如圖:

大概這就是vim統一用gb18030來識別gbk,gb2312和gb18030的好處。剛纔說到gb系的編碼方式大抵相同,只要三者同時包含的文字都會編碼一致。用file命令查看三種格式的文件的時候,都會顯示ISO-8859來表示這是gb系的編碼,具體哪種字符集是未知,如圖:

再看看內容一致的四個文件的二進制存儲,gb系的文件也是一致的。(所以,在vimrc中配置fileencoding中寫gb2312也是沒用的,甚至寫gbk都是沒用的,只要寫fileencoding=gb18030就可以了。

另,有些人的vim配置沒有識別當前文件編碼,我的是這樣配的,在狀態欄中顯示文件編碼:

set statusline=%<[%n]\
%F\ %h%m%r%=%k[%{(&fenc==\"\")?&enc:&fenc}%
{(&bomb?\",BOM\":\"\")}][%{&ff}][ASCII=\%03.3b]
\ %-10.(%l,%c%V%)\ %P

結論:

1,linux下的開發應其實和系統默認編碼無關
2,linux下的開發應當配置vimrc的fileencoding,配置內容如上。
3,如果vimrc中配置不首先使用gb18030來寫文件,應當在vim創建文件時手動執行set fileencoding=gb18030.
4,不建議在vimrc中將gb18030放在ucs-bom和utf-8前面,以避免linux中創建所有的文件都是gb編碼。畢竟,忘記轉換編碼是常事。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章