linux中顯示中文亂碼的問題
由于在windows下默認(rèn)是gb編碼,而我的vim默認(rèn)是utf-8(gedit默認(rèn)也是utf-8),所以打開會成亂碼。修改了一下配置文件,使vi 支持gb編碼就好了。
$vi ~/.vimrc
let &termencoding=&encoding
set fileencodings=utf-8,gbk
$:wq
再次打開vi ,顯示就正常了。
如果你需要在linux下面用到windows下的文件,拷貝上去后經(jīng)常發(fā)現(xiàn)中文顯示亂碼。。原因是Windows中默認(rèn)的文件格式是 GBK(gb2312),而Linux一般都是UTF-8。比較繁瑣的方法是在windows下用程序把內(nèi)容轉(zhuǎn)換為utf-8編碼格式的,但是相當(dāng)麻煩,而且遇到一個(gè)文件轉(zhuǎn)一回。下面介紹一下,在Linux中如何一勞永逸的解決這個(gè)問題,查看文件的編碼及如何進(jìn)行對文件進(jìn)行編碼轉(zhuǎn)換。
查看文件編碼
在Linux中查看文件編碼可以通過以下幾種方式:
1.在Vim 中可以直接查看文件編碼
:set fileencoding
即可顯示文件編碼格式。
文件編碼轉(zhuǎn)換
1.如果你只是想查看其它編碼格式的文件或者想解決用Vim查看文件亂碼的問題,那么你可以在
~/.vimrc(在/etc目錄下面) 文件中添加以下內(nèi)容:
set encoding=utf-8 fileencodings=ucs-bom,utf-8,cp936
其中encoding是vim的默認(rèn)顯示編碼格式,fileencodings是vim打開文件時(shí)檢測的編碼格式,存在這種類型的編碼即轉(zhuǎn)換為utf-8 編碼。
這樣,就可以讓vim自動識別文件編碼(可以自動識別UTF-8或者GBK編碼的文件),其實(shí)就是依照fileencodings提供的編碼列表嘗試,如果沒有找到合適的編碼,就用latin-1(ASCII)編碼打開。
2.在Vim中直接進(jìn)行轉(zhuǎn)換文件編碼,比如將一個(gè)文件轉(zhuǎn)換成utf-8格式(不好用)
:set fileencoding=utf-8
3.iconv 轉(zhuǎn)換,iconv的命令格式如下:(未用)
iconv -f encoding -t encoding inputfile
比如將一個(gè)UTF-8 編碼的文件轉(zhuǎn)換成GBK編碼
iconv -f GBK -t UTF-8 file1 -o file2
文件名編碼轉(zhuǎn)換:
從Linux 往 windows拷貝文件或者從windows往Linux拷貝文件,有時(shí)會出現(xiàn)中文文件名亂碼的情況,出現(xiàn)這種問題的原因是因?yàn)?,windows的文件名中文編碼默認(rèn)為GBK,而Linux中默認(rèn)文件名編碼為UTF8,由于編碼不一致,所以導(dǎo)致了文件名亂碼的問題,解決這個(gè)問題需要對文件名進(jìn)行轉(zhuǎn)碼。
在Linux中專門提供了一種工具convmv進(jìn)行文件名編碼的轉(zhuǎn)換,可以將文件名從GBK轉(zhuǎn)換成UTF-8編碼,或者從UTF-8轉(zhuǎn)換到GBK。
首先看一下你的系統(tǒng)上是否安裝了convmv,如果沒安裝的話用在
http://www.j3e.de/linux/convmv/convmv-1.14.tar.gz
下載,然后在windows下面解壓縮用winscp上傳真?zhèn)€目錄,之后進(jìn)入此目錄執(zhí)行make install命令,之后用convmv命令測試是否安裝成功,若顯示一些命令提示則表示成功了。
安裝。
下面看一下convmv的具體用法:
convmv -f 源編碼 -t 新編碼 [選項(xiàng)] 文件名
常用參數(shù):
-r 遞歸處理子文件夾
--notest 真正進(jìn)行操作,請注意在默認(rèn)情況下是不對文件進(jìn)行真實(shí)操作的,而只是試驗(yàn)。
--list 顯示所有支持的編碼
--unescap 可以做一下轉(zhuǎn)義,比如把%20變成空格
比如我們有一個(gè)utf8編碼的文件名,轉(zhuǎn)換成GBK編碼,命令如下:
convmv -f UTF-8 -t GBK --notest utf8編碼的文件名
這樣轉(zhuǎn)換以后"utf8編碼的文件名"會被轉(zhuǎn)換成GBK編碼(只是文件名編碼的轉(zhuǎn)換,文件內(nèi)容不會發(fā)生變化)
vim 編碼方式的設(shè)置
和所有的流行文本編輯器一樣,Vim 可以很好的編輯各種字符編碼的文件,這當(dāng)然包括UCS-2、UTF-8 等流行的 Unicode 編碼方式。然而不幸的是,和很多來自 Linux 世界的軟件一樣,這需要你自己動手設(shè)置。
Vim 有四個(gè)跟字符編碼方式有關(guān)的選項(xiàng),encoding、fileencoding、fileencodings、termencoding (這些選項(xiàng)可能的取值請參考 Vim 在線幫助 :help encoding-names),它們的意義如下:
* encoding: Vim 內(nèi)部使用的字符編碼方式,包括 Vim 的 buffer (緩沖區(qū))、菜單文本、消息文本等。默認(rèn)是根據(jù)你的locale選擇.用戶手冊上建議只在 .vimrc 中改變它的值,事實(shí)上似乎也只有在.vimrc 中改變它的值才有意義。你可以用另外一種編碼來編輯和保存文件,如你的vim的encoding為utf-8,所編輯的文件采用cp936編碼,vim會自動將讀入的文件轉(zhuǎn)成utf-8(vim的能讀懂的方式),而當(dāng)你寫入文件時(shí),又會自動轉(zhuǎn)回成cp936(文件的保存編碼).
* fileencoding: Vim 中當(dāng)前編輯的文件的字符編碼方式,Vim 保存文件時(shí)也會將文件保存為這種字符編碼方式 (不管是否新文件都如此)。
* fileencodings: Vim自動探測fileencoding的順序列表, 啟動時(shí)會按照它所列出的字符編碼方式逐一探測即將打開的文件的字符編碼方式,并且將 fileencoding 設(shè)置為最終探測到的字符編碼方式。因此最好將Unicode 編碼方式放到這個(gè)列表的最前面,將拉丁語系編碼方式 latin1 放到最后面。
* termencoding: Vim 所工作的終端 (或者 Windows 的 Console 窗口) 的字符編碼方式。如果vim所在的term與vim編碼相同,則無需設(shè)置。如其不然,你可以用vim的termencoding選項(xiàng)將自動轉(zhuǎn)換成term 的編碼.這個(gè)選項(xiàng)在 Windows 下對我們常用的 GUI 模式的 gVim 無效,而對 Console 模式的Vim 而言就是 Windows 控制臺的代碼頁,并且通常我們不需要改變它。
好了,解釋完了這一堆容易讓新手犯糊涂的參數(shù),我們來看看 Vim 的多字符編碼方式支持是如何工作的。
1. Vim 啟動,根據(jù) .vimrc 中設(shè)置的 encoding 的值來設(shè)置 buffer、菜單文本、消息文的字符編碼方式。
2. 讀取需要編輯的文件,根據(jù) fileencodings 中列出的字符編碼方式逐一探測該文件編碼方式。并設(shè)置 fileencoding 為探測到的,看起來是正確的 (注1) 字符編碼方式。
3. 對比 fileencoding 和 encoding 的值,若不同則調(diào)用 iconv 將文件內(nèi)容轉(zhuǎn)換為encoding 所描述的字符編碼方式,并且把轉(zhuǎn)換后的內(nèi)容放到為此文件開辟的 buffer 里,此時(shí)我們就可以開始編輯這個(gè)文件了。注意,完成這一步動作需要調(diào)用外部的 iconv.dll(注2),你需要保證這個(gè)文件存在于 $VIMRUNTIME 或者其他列在 PATH 環(huán)境變量中的目錄里。
4. 編輯完成后保存文件時(shí),再次對比 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 自動探測文件的編碼方式會更準(zhǔn)確 (或許這個(gè)理由才是主要的 ;)。我們在中文 Windows 里編輯的文件,為了兼顧與其他軟件的兼容性,文件編碼還是設(shè)置為 GB2312/GBK 比較合適,因此 fileencoding 建議設(shè)置為 chinese (chinese 是個(gè)別名,在 Unix 里表示 gb2312,在 Windows 里表示cp936,也就是 GBK 的代碼頁)。
vim中編輯不同編碼的文件時(shí)需要注意的一些地方
此文講解的是vim編輯多字節(jié)編碼文檔(中文)所要了解的一些基礎(chǔ)知識,注意其沒有涉及gvim,純指字符終端下的vim。
vim編碼方面的基礎(chǔ)知識:
1,存在3個(gè)變量:
encoding—-該選項(xiàng)使用于緩沖的文本(你正在編輯的文件),寄存器,Vim 腳本文件等等。你可以把 ‘encoding’ 選項(xiàng)當(dāng)作是對 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í)自動辨認(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和、文件本身編碼以及自動編碼識別、客戶運(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的情況下,啟動vim后encoding將會設(shè)置為utf-8,這是兼容性最好的方式,因?yàn)閮?nèi)部 處理使用utf-8的話,無論外部存儲編碼為何都可以進(jìn)行無缺損轉(zhuǎn)換。locale決定了vim內(nèi)部處理數(shù)據(jù)的編碼,也就是encoding。
2,文件的編碼以及自動編碼識別—-這方面牽扯到各種編碼的規(guī)則,就不一一細(xì)講了。但需要明白的是,文件編碼類型并不是保存在文件內(nèi)的,也就是
關(guān)鍵詞:linux,中文亂碼
閱讀本文后您有什么感想? 已有 人給出評價(jià)!
- 1
- 1
- 1
- 1
- 1
- 1