linux下基於vim的檔案編碼

來源:互聯網
上載者:User

掙紮後,我們還是向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編碼。畢竟,忘記轉換編碼是常事。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.