一直以來,經(jīng)常被debian的編碼問題尤其是vim編碼問題影響了工作效率,花了點時間研究下,茅塞頓開(其實很多困惑很久的問題認真花幾個小時甚至更短時間就可以徹底解決從而大大提高工作效率,但是我們平時往往習(xí)慣了忍受它們),發(fā)現(xiàn)完全可以實現(xiàn)debian中無亂碼顯示及在vim中編碼自適應(yīng),而且只用很簡單的配置(最終就是在vimrc中添加4行配置和終端軟件修改1個配置)而且終身享用(以后基本不用再修改配置),編碼自適應(yīng)最根本的原理:能自動判斷字符的編碼,vim可以做到,但終端軟件如XShell,SecureCRT,putty都做不到1.系統(tǒng)默認編碼:為了和程序包編碼兼容和轉(zhuǎn)換,系統(tǒng)最好用zh_CN.UTF-8,因為任意編碼可以和utf-8編碼之間實現(xiàn)無損轉(zhuǎn)換,安裝debian時選擇“簡體中文”,則用系統(tǒng)默認編碼即為zh_CN.UTF-82.用戶自己的locale編碼:不用設(shè)置,既采用系統(tǒng)默認編碼,相當(dāng)于locale也是zh_CN.UTF-83.終端編碼:用utf-8,建議用XShell把編碼設(shè)置成utf-8(雖然SecureCRT也設(shè)置成utf-8也可以正確顯示,但不能輸入漢字)4.程序包編碼:很多常見的程序包的輸出都是utf-8編碼,如pdb,git等5.終端編碼,本地locale編碼,系統(tǒng)默認編碼,程序包編碼都是utf-8,這樣就會保證系統(tǒng)和程序包中的中文都能正確顯示6.vim編碼自適應(yīng): 也是我們平時我們接觸最多,遇到編碼總是最多的,我們最希望解決的問題是: 1).不管文件是什么編碼,用vim打開后能正確顯示和編輯并正確保存 2).新建文件時可以選擇某種喜愛的編碼 為了解決這些問題,首先講一下vim編碼原理 1).fileencodeings(fencs):文件可能的存儲編碼集合,賦值例子:set fencs=utf-8,gbk,gb2312,gb18030,cs-bom,cp936,latin1,打開1個文件時,會嘗試從前往后用此值的編碼來解碼,如解碼成功,說認為此文件就是此編碼,同時把fenc設(shè)置成此編碼 2).fileencoding(fenc):文件存儲編碼,賦值例子:set fenc=gbk;打開非空文件時由通過fencs猜測到的編碼來設(shè)置此值,不可能為空;新建一個文件時fenc為空;保存文件時,如fenc值非空則把enc編碼轉(zhuǎn)換為fenc編碼來存儲,如為空則不進行編碼轉(zhuǎn)換,直接用enc編碼來存儲,涉及到轉(zhuǎn)換 3).encoding(enc):vim內(nèi)存中的編碼,賦值例子:set enc=utf-8; 此值默認取locale的編碼,如為空則不對鄰層編碼做處理,讀文件時vim會把fenc的編碼轉(zhuǎn)換成enc編碼,寫文件時vim會把tenc的編碼轉(zhuǎn)換成enc編碼,涉及到編碼轉(zhuǎn)換 4).termencodeings(tenc):shell終端編碼,賦值例子:set tenc=utf-8,如此值為空對鄰層傳過來來的編碼為做任何處理,直接傳給下一層;如非空則顯示文件時會把enc編碼轉(zhuǎn)換為tenc編碼,接受輸入時會把輸入的編碼轉(zhuǎn)換為tenc,涉及到編碼轉(zhuǎn)換 5).終端軟件顯示字段的編碼:終端軟件如SecureCRT和XShell,用此編碼來顯示字符,不進行編碼轉(zhuǎn)換,顯然如tenc編碼與此值不一致, 則顯示為亂碼 可見vim編碼的復(fù)雜性,實際上也很簡單,類似OSI的網(wǎng)絡(luò)分層模型,自上而下,下層為上層服務(wù),當(dāng)把文件中的字符顯示到終端軟件時,從1)至5);當(dāng)把由鍵盤輸入到終端軟件的字符保存到文件時,從5)至2), 某一層的值為空,則不對由鄰層傳入來的內(nèi)容做任何處理,也可以理解編碼同鄰層,不為空且和鄰層編碼不同時,則涉及著編碼轉(zhuǎn)換,另外4)和5)這層必須設(shè)置成一樣的編碼,這兩層之間不涉及到編碼轉(zhuǎn)換 基于此原理,打開~/.vimrc加上以下行設(shè)置: set fencs=utf-8,gbk,gb2312,gb18030,cs-bom,cp936,latin1 set fenc=gbk #習(xí)慣新建文件是某種編碼則在此寫上此編碼 set enc=utf-8 set tenc=utf-8 另外,XShell編碼設(shè)置成utf-8 #設(shè)置成utf-8是為正確顯示系統(tǒng)和程序包的中文(因為它們默認是utf-8編碼),但如用SecureCRT把此值設(shè)置成utf-8后,在命令行和vim輸入漢字后就變成了亂碼,這個應(yīng)該是其bug,XShell就不在在這個問題 在vim中編輯1個文件時,隨時可以用:set fenc來修改文件存儲的編碼,非常方便 在vim查看上面4個值的辦法,:set 變量名,會顯示完整的變量名=值,如如:set fenc,會顯示fileencoding=cp936(就是是gbk) 查看某個文件編碼的方法:用vim打開,并調(diào)用:set fenc即可 其實vim編碼自適應(yīng)最關(guān)鍵的一點是在打開文件時能根據(jù)fencs的值來自動判斷此文件是什么編碼,曾經(jīng)我也想著如果一個終端軟件能夠做到這一點就好了,但遺憾的XShell和SecureCRT,putty都不能,不知道其他的行不行 7.其它文本編輯器能不能編碼自適應(yīng)我沒有研究過8.未解決的問題 除了vim的程序的輸出如果編碼與終端軟件編碼不一致,則顯示亂碼,最根本的原因是終端軟件不能自動判斷字符的編碼,如果可以的話,那么其他一切編碼自適應(yīng)都是多余的,如vim編碼自適應(yīng)注:此文中vim編碼自適應(yīng)中很多是我個人理解,但完全能自圓其說,解釋各種各樣的問題,如有爭議歡迎來討論
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點擊舉報。