天天看點

Linux下檢視檔案編碼,檔案編碼格式轉換和檔案名編碼轉換

如果你需要在Linux中操作windows下的檔案,那麼你可能會經常遇到檔案編碼轉換的問題。Windows中預設的檔案格式是GBK(gb2312),而Linux一般都是UTF-8。下面介紹一下,在Linux中如何檢視檔案的編碼及如何進行對檔案進行編碼轉換。

檢視檔案編碼

在Linux中檢視檔案編碼可以通過以下幾種方式:

1.在Vim中可以直接檢視檔案編碼

:set fileencoding

即可顯示檔案編碼格式。

如果你隻是想檢視其它編碼格式的檔案或者想解決用Vim檢視檔案亂碼的問題,那麼你可以在

~/.vimrc 檔案中添加以下内容:

set encoding=utf-8 fileencodings=ucs-bom,utf-8,cp936

這樣,就可以讓vim自動識别檔案編碼(可以自動識别UTF-8或者GBK編碼的檔案),其實就是依照fileencodings提供的編碼清單嘗試,如果沒有找到合适的編碼,就用latin-1(ASCII)編碼打開。

檔案編碼轉換

1.在Vim中直接進行轉換檔案編碼,比如将一個檔案轉換成utf-8格式

:set fileencoding=utf-8

2. iconv 轉換,iconv的指令格式如下:

iconv -f encoding -t encoding inputfile

比如将一個UTF-8 編碼的檔案轉換成GBK編碼

iconv -f GBK -t UTF-8 file1 -o file2

檔案名編碼轉換:

從Linux往 windows拷貝檔案或者從windows往Linux拷貝檔案,有時會出現中文檔案名亂碼的情況,出現這種問題的原因是因為,windows的檔案名 中文編碼預設為GBK,而Linux中預設檔案名編碼為UTF8,由于編碼不一緻,是以導緻了檔案名亂碼的問題,解決這個問題需要對檔案名進行轉碼。

在Linux中專門提供了一種工具convmv進行檔案名編碼的轉換,可以将檔案名從GBK轉換成UTF-8編碼,或者從UTF-8轉換到GBK。

首先看一下你的系統上是否安裝了convmv,如果沒安裝的話用:

yum -y install convmv

安裝。

下面看一下convmv的具體用法:

convmv -f 源編碼 -t 新編碼 [選項] 檔案名

常用參數:

-r 遞歸處理子檔案夾

--notest 真正進行操作,請注意在預設情況下是不對檔案進行真實操作的,而隻是試驗。

--list 顯示所有支援的編碼

--unescap 可以做一下轉義,比如把%20變成空格

比如我們有一個utf8編碼的檔案名,轉換成GBK編碼,指令如下:

convmv -f UTF-8 -t GBK --notest utf8編碼的檔案名

這樣轉換以後"utf8編碼的檔案名"會被轉換成GBK編碼(隻是檔案名編碼的轉換,檔案内容不會發生變化)

vim 編碼方式的設定

和所有的流行文本編輯器一樣,Vim 可以很好的編輯各種字元編碼的檔案,這當然包括UCS-2、UTF-8 等流行的 Unicode 編碼方式。然而不幸的是,和很多來自 Linux 世界的軟體一樣,這需要你自己動手設定。

Vim 有四個跟字元編碼方式有關的選項,encoding、fileencoding、fileencodings、termencoding (這些選項可能的取值請參考 Vim 線上幫助 :help encoding-names),它們的意義如下:

* encoding: Vim 内部使用的字元編碼方式,包括 Vim 的 buffer (緩沖區)、菜單文本、消息文本等。預設是根據你的locale選擇.使用者手冊上建議隻在 .vimrc 中改變它的值,事實上似乎也隻有在.vimrc 中改變它的值才有意義。你可以用另外一種編碼來編輯和儲存檔案,如你的vim的encoding為utf-8,所編輯的檔案采用cp936編碼,vim會 自動将讀入的檔案轉成utf-8(vim的能讀懂的方式),而當你寫入檔案時,又會自動轉回成cp936(檔案的儲存編碼).

* fileencoding: Vim 中目前編輯的檔案的字元編碼方式,Vim 儲存檔案時也會将檔案儲存為這種字元編碼方式 (不管是否新檔案都如此)。

* fileencodings: Vim自動探測fileencoding的順序清單, 啟動時會按照它所列出的字元編碼方式逐一探測即将打開的檔案的字元編碼方式,并且将 fileencoding 設定為最終探測到的字元編碼方式。是以最好将Unicode 編碼方式放到這個清單的最前面,将拉丁語系編碼方式 latin1 放到最後面。

* termencoding: Vim 所工作的終端 (或者 Windows 的 Console 視窗) 的字元編碼方式。如果vim所在的term與vim編碼相同,則無需設定。如其不然,你可以用vim的termencoding選項将自動轉換成term 的編碼.這個選項在 Windows 下對我們常用的 GUI 模式的 gVim 無效,而對 Console 模式的Vim 而言就是 Windows 控制台的代碼頁,并且通常我們不需要改變它。

好了,解釋完了這一堆容易讓新手犯糊塗的參數,我們來看看 Vim 的多字元編碼方式支援是如何工作的。

1. Vim 啟動,根據 .vimrc 中設定的 encoding 的值來設定 buffer、菜單文本、消息文的字元編碼方式。

2. 讀取需要編輯的檔案,根據 fileencodings 中列出的字元編碼方式逐一探測該檔案編碼方式。并設定 fileencoding 為探測到的,看起來是正确的 (注1) 字元編碼方式。

3. 對比 fileencoding 和 encoding 的值,若不同則調用 iconv 将檔案内容轉換為encoding 所描述的字元編碼方式,并且把轉換後的内容放到為此檔案開辟的 buffer 裡,此時我們就可以開始編輯這個檔案了。注意,完成這一步動作需要調用外部的 iconv.dll(注2),你需要保證這個檔案存在于 $VIMRUNTIME 或者其他列在 PATH 環境變量中的目錄裡。

4. 編輯完成後儲存檔案時,再次對比 fileencoding 和 encoding 的值。若不同,再次調用 iconv 将即将儲存的 buffer 中的文本轉換為 fileencoding 所描述的字元編碼方式,并儲存到指定的檔案中。同樣,這需要調用 iconv.dll由于 Unicode 能夠包含幾乎所有的語言的字元,而且 Unicode 的 UTF-8 編碼方式又是非常具有成本效益的編碼方式 (空間消耗比 UCS-2 小),是以建議 encoding 的值設定為utf-8。這麼做的另一個理由是 encoding 設定為 utf-8 時,Vim 自動探測檔案的編碼方式會更準确 (或許這個理由才是主要的 ;)。我們在中文 Windows 裡編輯的檔案,為了兼顧與其他軟體的相容性,檔案編碼還是設定為 GB2312/GBK 比較合适,是以 fileencoding 建議設定為 chinese (chinese 是個别名,在 Unix 裡表示 gb2312,在 Windows 裡表示cp936,也就是 GBK 的代碼頁)。

繼續閱讀