一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

vim7.2中文亂碼解決方法

 紫火神兵 2013-07-08

這個(gè)問題困擾我?guī)滋炝?。網(wǎng)上查了許久,由于說得不到位,一直沒解決,今天又折騰了一下,終于搞定。

1、下載

可到http://www./下載最新的7.2。

2、安裝

編譯之前,先要configure --help查看一下配置選項(xiàng),
--enable-multibyte      Include multibyte editing support. 

支持多字節(jié)編碼,這一步很重要。否則,后面如何配置也是枉然。

然后,
[root@localhost wbl]# vim --version | grep multi
-mouse_jsbterm -mouse_netterm -mouse_sysmouse +mouse_xterm +multi_byte
+multi_lang -mzscheme +netbeans_intg -osfiletype +path_extra -perl +postscript
查看配置是否起作用。

 3、配置

編輯~/.vimrc文件,加上如下幾行:

set fileencodings=gb2312,gb18030,utf-8
set termencoding=utf-8
set encoding=prc 

 即可搞定。

 

附(Vim編碼詳細(xì)介紹):

Vim和所有的流行文本編輯器一樣,Vim 可以很好的編輯各種字符編碼的文件,這當(dāng)然包括 UCS-2、UTF-8 等流行的 Unicode 編碼方式。

Vim 有四個(gè)跟字符編碼方式有關(guān)的選項(xiàng),encoding、fileencoding、fileencodings、termencoding (這些選項(xiàng)可能的取值請(qǐng)參考 Vim 在線幫助 :help encoding-names),它們的意義如下:
(1)encoding: Vim 內(nèi)部使用的字符編碼方式,包括 Vim 的 buffer (緩沖區(qū))、菜單文本、消息文本等。用戶手冊(cè)上建議只在 .vimrc 中改變它的值,事實(shí)上似乎也只有在 .vimrc 中改變它的值才有意義。
(2)fileencoding: Vim 中當(dāng)前編輯的文件的字符編碼方式,Vim 保存文件時(shí)也會(huì)將文件保存為這種字符編碼方式 (不管是否新文件都如此)。
(3)fileencodings: Vim 啟動(dòng)時(shí)會(huì)按照它所列出的字符編碼方式逐一探測(cè)即將打開的文件的字符編碼方式,并且將 fileencoding 設(shè)置為最終探測(cè)到的字符編碼方式。因此最好將 Unicode 編碼方式放到這個(gè)列表的最前面,將拉丁語系編碼方式 latin1 放到最后面。
(4)ermencoding: Vim 所工作的終端 (或者 Windows 的 Console 窗口) 的字符編碼方式。這個(gè)選項(xiàng)在 Windows 下對(duì)我們常用的 GUI 模式的 gVim 無效,而對(duì) Console 模式的 Vim 而言就是 Windows 控制臺(tái)的代碼頁,并且通常我們不需要改變它。

來看看 Vim 的多字符編碼方式支持是如何工作的。
(1)Vim 啟動(dòng),根據(jù) .vimrc 中設(shè)置的 encoding 的值來設(shè)置 buffer、菜單文本、消息文的字符編碼方式。
(2)讀取需要編輯的文件,根據(jù) fileencodings 中列出的字符編碼方式逐一探測(cè)該文件編碼方式。并設(shè)置 fileencoding 為探測(cè)到的,看起來是正確的 (注1) 字符編碼方式。
(3)對(duì)比 fileencoding 和 encoding 的值,若不同則調(diào)用 iconv 將文件內(nèi)容轉(zhuǎn)換為 encoding 所描述的字符編碼方式,并且把轉(zhuǎn)換后的內(nèi)容放到為此文件開辟的 buffer 里,此時(shí)我們就可以開始編輯這個(gè)文件了。注意,完成這一步動(dòng)作需要調(diào)用外部的 iconv.dll (注2),你需要保證這個(gè)文件存在于 $VIMRUNTIME 或者其他列在 PATH 環(huán)境變量中的目錄里。
(4)編輯完成后保存文件時(shí),再次對(duì)比 fileencoding 和 encoding 的值。若不同,再次調(diào)用 iconv 將即將保存的 buffer 中的文本轉(zhuǎn)換為 fileencoding 所描述的字符編碼方式,并保存到指定的文件中。同樣,這需要調(diào)用 iconv.dll

由于 Unicode 能夠包含幾乎所有的語言的字符,而且 Unicode 的 UTF-8 編碼方式又是非常具有性價(jià)比的編碼方式 (空間消耗比 UCS-2 小),因此建議 encoding 的值設(shè)置為 utf-8。這么做的另一個(gè)理由是 encoding 設(shè)置為 utf-8 時(shí),Vim 自動(dòng)探測(cè)文件的編碼方式會(huì)更準(zhǔn)確 (或許這個(gè)理由才是主要的 ;) 。我們?cè)谥形?Windows 里編輯的文件,為了兼顧與其他軟件的兼容性,文件編碼還是設(shè)置為 GB2312/GBK 比較合適,因此 fileencoding 建議設(shè)置為 chinese (chinese 是個(gè)別名,在 Unix 里表示 gb2312,在 Windows 里表示 cp936,也就是 GBK 的代碼頁)。 

linux中vi顯示中文亂碼的問題  

方法一:

由于在windows下默認(rèn)是gb編碼,而我的vim默認(rèn)是utf-8(gedit默認(rèn)也是utf-8),所以打開會(huì)成亂碼。修改了一下配置文件,使vi支持gb編碼就好了。

$vi ~/.vimrc

let &termencoding=&encoding

set fileencodings=utf-8,gbk

$:wq

再次打開vi,顯示就正常了。

vim中編輯不同編碼的文件時(shí)需要注意的一些地方

此文講解的是vim編輯多字節(jié)編碼文檔(中文)所要了解的一些基礎(chǔ)知識(shí),注意其沒有涉及gvim,純指字符終端下的vim。

vim編碼方面的基礎(chǔ)知識(shí):


1,存在3個(gè)變量:

encoding—-該選項(xiàng)使用于緩沖的文本(你正在編輯的文件),寄存器,Vim 腳本文件等等。你可以把 ‘encoding’ 選項(xiàng)當(dāng)作是對(duì) Vim 內(nèi)部運(yùn)行機(jī)制的設(shè)定。

fileencoding—-該選項(xiàng)是vim寫入文件時(shí)采用的編碼類型。

termencoding—-該選項(xiàng)代表輸出到客戶終端(Term)采用的編碼類型。

2,此3個(gè)變量的默認(rèn)值:

encoding—-與系統(tǒng)當(dāng)前l(fā)ocale相同,所以編輯文件的時(shí)候要考慮當(dāng)前l(fā)ocale,否則要設(shè)置的東西就比較多了。

fileencoding—-vim打開文件時(shí)自動(dòng)辨認(rèn)其編碼,fileencoding就為辨認(rèn)的值。為空則保存文件時(shí)采用encoding的編碼,如果沒有修改encoding,那值就是系統(tǒng)當(dāng)前l(fā)ocale了。

termencoding—-默認(rèn)空值,也就是輸出到終端不進(jìn)行編碼轉(zhuǎn)換。

由此可見,編輯不同編碼文件需要注意的地方不僅僅是這3個(gè)變量,還有系統(tǒng)當(dāng)前l(fā)ocale和、文件本身編碼以及自動(dòng)編碼識(shí)別、客戶運(yùn)行vim的終端所使用的編碼類型3個(gè)關(guān)鍵點(diǎn),這3個(gè)關(guān)鍵點(diǎn)影響著3個(gè)變量的設(shè)定。

如果有人問:為什么我用vim打開中文文檔的時(shí)候出現(xiàn)亂碼?

答案是不確定的,原因上面已經(jīng)講了,不搞清楚這3個(gè)關(guān)鍵點(diǎn)和這3個(gè)變量的設(shè)定值,出現(xiàn)亂碼是正常的,倒是不出現(xiàn)亂碼那反倒是湊巧的。

再來看一下常見情況下這三個(gè)關(guān)鍵點(diǎn)的值以及在這種情況下這3個(gè)變量的值:

1,locale—-目前大部分Linux系統(tǒng)已經(jīng)將utf-8作為默認(rèn)locale了,不過也有可能不是,例如有些系統(tǒng)使用中文locale zh_CN.GB18030。在locale為utf-8的情況下,啟動(dòng)vim后encoding將會(huì)設(shè)置為utf-8,這是兼容性最好的方式,因?yàn)閮?nèi)部 處理使用utf-8的話,無論外部存儲(chǔ)編碼為何都可以進(jìn)行無缺損轉(zhuǎn)換。locale決定了vim內(nèi)部處理數(shù)據(jù)的編碼,也就是encoding。

2,文件的編碼以及自動(dòng)編碼識(shí)別—-這方面牽扯到各種編碼的規(guī)則,就不一一細(xì)講了。但需要明白的是,文件編碼類型并不是保存在文件內(nèi)的,也就是說沒有任何 描述性的字段來記錄文檔是何種編碼類型的。因此我們?cè)诰庉嬑臋n的時(shí)候,要么必須知道這文檔保存時(shí)是以什么編碼保存的,要么通過另外的一些手段來斷定編碼類 型,這另外的手段,就是通過某些編碼的碼表特征來斷定,例如每個(gè)字符占用的字節(jié)數(shù),每個(gè)字符的ascii值是否都大于某個(gè)字段來斷定這個(gè)文件屬于何種編 碼。這種方式vim也使用了,這就是vim的自動(dòng)編碼識(shí)別機(jī)制了。但這種機(jī)制由于編碼各式各樣,不可能每種編碼都有顯著的特征來辨別,所以是不可能 100%準(zhǔn)確的。對(duì)于我們GB2312編碼,由于其中文是使用了2個(gè)acsii值高于127的字符組成漢字字符的,因此不可能把gb2312編碼的文件與 latin1編碼區(qū)分開來,因此自動(dòng)識(shí)別編碼的機(jī)制對(duì)于gb2312是不成功的,它只會(huì)將文件辨識(shí)為latin1編碼。此問題同樣出現(xiàn)在gbk,big5 上等。因此我們?cè)诰庉嫶祟愇臋n時(shí),需要手工設(shè)定encoding和fileencoding。如果文檔編碼為utf-8時(shí),一般vim都能自動(dòng)識(shí)別正確的 編碼。

3,客戶運(yùn)行vim的終端所使用的編碼類型—-同第二條一樣,這也是一個(gè)比較難以斷定的關(guān)鍵點(diǎn)。第二個(gè)關(guān)鍵點(diǎn)決定著從文件讀取內(nèi)容和寫入內(nèi)容到文件 時(shí)使用的編碼,而此關(guān)鍵點(diǎn)則決定vim輸出內(nèi)容到終端時(shí)使用的編碼,如果此編碼類型和終端認(rèn)為它收到的數(shù)據(jù)的編碼類型不同,則又會(huì)產(chǎn)生亂碼問題。在 linux本地X環(huán)境下,一般終端都認(rèn)為其接收的數(shù)據(jù)的編碼類型和系統(tǒng)locale類型相符,因此不需關(guān)心此方面是否存在問題。但如果牽涉到遠(yuǎn)程終端,例 如ssh登錄服務(wù)器,則問題就有可能出現(xiàn)了。例如從1臺(tái)locale為GB2310的系統(tǒng)(稱作客戶機(jī))ssh到locale為utf-8的系統(tǒng)(稱作服 務(wù)器)并開啟vim編輯文檔,在不加任何改動(dòng)的情況下,服務(wù)器返回的數(shù)據(jù)為utf-8的,但客戶機(jī)認(rèn)為服務(wù)器返回的數(shù)據(jù)是gb2312的,按照 gb2312來解釋數(shù)據(jù),則肯定就是亂碼了,這時(shí)就需要設(shè)置termencoding為gb2312來解決這個(gè)問題。此問題更多出現(xiàn)在我們的 windows desktop機(jī)遠(yuǎn)程ssh登錄服務(wù)器的情況下,這里牽扯到不同系統(tǒng)的編碼轉(zhuǎn)換問題。所以又與windows本身以及ssh客戶端有很大相關(guān)性。在 windows下存在兩種編碼類型的軟件,一種是本身就為unicode編碼方式編寫的軟件,一種是ansi軟件,也就是程序處理數(shù)據(jù)直接采用字節(jié)流,不 關(guān)心編碼。前一種程序可以在任何語言的windows上正確顯示多國(guó)語言,而后一種則編寫在何種語言的系統(tǒng)上則只能在何種語言的系統(tǒng)上顯示正確的文字。對(duì) 于這兩種類型的程序,我們需要區(qū)別對(duì)待。以ssh客戶端為例,我們使用的putty是unicode軟件,而secure CRT則是ansi 軟件。對(duì)于前者,我們要正確處理中文,只要保證vim輸出到終端的編碼為utf-8即可,就是termencoding=utf-8。但對(duì)于后者,一方面 我們要確認(rèn)我們的windows系統(tǒng)默認(rèn)代碼頁為cp936(中文windows默認(rèn)值),另一方面要確認(rèn)vim設(shè)置的termencoding= cp936。

最后來看看處理中文文檔最典型的幾種情況和設(shè)置方式:

1,系統(tǒng)locale是utf-8(很多l(xiāng)inux系統(tǒng)默認(rèn)的locale形式),編輯的文檔是GB2312或GBK形式的(Windows記事本 默認(rèn)保存形式,大部分編輯器也默認(rèn)保存為這個(gè)形式,所以最常見),終端類型utf-8(也就是假定客戶端是putty類的unicode軟件)

則vim打開文檔后,encoding=utf-8(locale決定的),fileencoding=latin1(自動(dòng)編碼判斷機(jī)制不準(zhǔn)導(dǎo)致的),termencoding=空(默認(rèn)無需轉(zhuǎn)換term編碼),顯示文件為亂碼。

解決方案1:首先要修正fileencoding為cp936或者euc-cn(二者一樣的,只不過叫法不同),注意修正的方法不是:set fileencoding=cp936,這只是將文件保存為cp936,正確的方法是重新以cp936的編碼方式加載文件為:edit ++enc=cp936,可以簡(jiǎn)寫為:e ++enc=cp936。

解決方案2:臨時(shí)改變vim運(yùn)行的locale環(huán)境,方法是以LANG=zh_CN vim abc.txt的方式來啟動(dòng)vim,則此時(shí)encoding=euc-cn(locale決定的),fileencoding=空(此locale下文件 編碼自動(dòng)判別功能不啟用,所以fileencoding為文件本身編碼方式不變,也就是euc-cn),termencoding=空(默認(rèn)值,為空則等 于encoding)此時(shí)還是亂碼的,因?yàn)槲覀兊膕sh終端認(rèn)為接受的數(shù)據(jù)為utf-8,但vim發(fā)送數(shù)據(jù)為euc-cn,所以還是不對(duì)。此時(shí)再用命令: set termencoding=utf-8將終端數(shù)據(jù)輸出為utf-8,則顯示正常。

2,情況與1基本相同,只是使用的ssh軟件為secure CRT類ansi類軟件。

vim打開文檔后,encoding=utf-8(locale決定的),fileencoding=latin1(自動(dòng)編碼判斷機(jī)制不準(zhǔn)導(dǎo)致的),termencoding=空(默認(rèn)無需轉(zhuǎn)換term編碼),顯示文件為亂碼。

解決方案1:首先要保證運(yùn)行secure CRT的windows機(jī)器的默認(rèn)代碼頁為CP936,這一點(diǎn)中文windows已經(jīng)是默認(rèn)設(shè)置了。其他的與上面方案1相同,只是要增加一步,:set termencoding=cp936

解決方案2:與上面方案2類似,不過最后一步修改termencoding省略即可,在此情況下需要的修改最少,只要以locale為zh_CN開 啟vim,則encoding=euc-cn,fileencoding和termencoding都為空即為encoding的值,是最理想的一種情 況。

可見理解這3個(gè)關(guān)鍵點(diǎn)和3個(gè)參數(shù)的意義,對(duì)于編碼問題有很大助力,以后就可以隨心所欲的處理文檔了,同時(shí)不僅僅是應(yīng)用于vim,在其他需要編碼轉(zhuǎn)換的環(huán)境里,都可以應(yīng)用類似的思路來處理問題解決問題。

最后推薦一款功能強(qiáng)大的windows下的ssh客戶端—-xshell,它具有類似secure CRT一樣的多tab 的ssh窗口的能力,但最為方便的是這款工具還有改變Term編碼的功能,這樣我們就可以不用頻繁調(diào)整termencoding,只需在ssh軟件里切換 編碼即可,這是我用過的最為方便的ssh工具。它是商業(yè)軟件,但非注冊(cè)用戶使用沒有任何限制,只是30天試用期超出后會(huì)每次啟動(dòng)都提示注冊(cè),對(duì)于功能沒有 絲毫影響。


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    国产亚洲欧美另类久久久| 中文字幕日产乱码一区二区| 午夜亚洲精品理论片在线观看| 国产成人亚洲欧美二区综| 香蕉久久夜色精品国产尤物| 九九热视频免费在线视频| 久久国内午夜福利直播| 国产免费观看一区二区| 日本一本在线免费福利| 久久这里只有精品中文字幕| 国产日韩熟女中文字幕| 国语久精品在视频在线观看| 精品少妇人妻av一区二区蜜桃| 人妻少妇久久中文字幕久久| 久久国产亚洲精品成人| 国产又粗又猛又爽色噜噜| 日本欧美一区二区三区就| 人体偷拍一区二区三区| 国产精品日韩精品一区| 国产熟女一区二区精品视频| 内射精子视频欧美一区二区| 激情内射日本一区二区三区| 国产水滴盗摄一区二区| 国产成人精品午夜福利| 欧美精品亚洲精品一区| 欧美日韩国产精品黄片| 老鸭窝精彩从这里蔓延| 亚洲精品成人午夜久久| 国产精品午夜福利免费在线| 午夜精品久久久99热连载| 深夜少妇一区二区三区| 国产精品亚洲一级av第二区| 欧美日韩黑人免费观看| 深夜福利亚洲高清性感| 大伊香蕉一区二区三区| 国产精品日韩欧美一区二区| 国产偷拍精品在线视频| 日韩精品成区中文字幕| 亚洲精品中文字幕欧美| 日韩欧美一区二区久久婷婷| 国产一级特黄在线观看|