linux和windows雙系統互拷文件亂碼問題

    如果你需要在linux下面用到windows下的文件,拷貝上去後經常發現中文顯示亂碼。

    原因是Windows中默認的文件格式是GBK(gb2312),而Linux一般都是UTF-8。比較繁瑣的方法是在windows下用程序把內容轉換爲utf-8編碼格式的,但是相當麻煩,而且遇到一個文件轉一回。

    下面介紹一下,在Linux中如何一勞永逸的解決這個問題,查看文件的編碼及如何進行對文件進行編碼轉換。


查看文件編碼

在Linux中查看文件編碼可以通過以下幾種方式:

1、在Vim中可以直接查看文件編碼

    :set fileencoding

    即可顯示文件編碼格式。


文件編碼轉換

1、如果你只是想查看其它編碼格式的文件或者想解決用Vim查看文件亂碼的問題,那麼你可以在~/.vimrc(在/etc目錄下面) 文件中添加以下內容:

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

    其中encoding是vim的默認顯示編碼格式,fileencodings是vim打開文件時檢測的編碼格式,存在這種類型的編碼即轉換爲utf-8編碼。

    這樣,就可以讓vim自動識別文件編碼(可以自動識別UTF-8或者GBK編碼的文件),其實就是依照fileencodings提供的編碼列表嘗試,如果沒有找到合適的編碼,就用latin-1(ASCII)編碼打開。

2、在Vim中直接進行轉換文件編碼,比如將一個文件轉換成utf-8格式(不好用)

        :set fileencoding=utf-8

3、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,如果沒安裝的話用在http://www.j3e.de/linux/convmv/convmv-1.14.tar.gz下載,然後在windows下面解壓縮用winscp上傳真個目錄,之後進入此目錄執行make 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,你需要保證這個文件存在於 $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 的代碼頁)。


額外的例子:

a)轉換文件內容編碼

    Windows下天生的純文本文件,其中文編碼爲GBK,在Ubuntu下顯示爲亂碼,可以使用iconv命令進行轉換:

        iconv -f gbk -t utf8 source_file > target_file

b)解壓zip文件亂碼

    在Ubuntu下使用unzip解壓Widnows環境下天生的zip文件,會發生文件名或者目錄名亂碼現象,解決辦法是使用 7-zip和convmv。

    安裝7-zip和convmv:

        sudo apt-get install convmv p7zip-full

    解壓zip文件:

        LANG=C 7z e zip_file

        convmv -f gbk -t utf8 -r --notest *

c)PDF中文亂碼

    PDF文件中的中文顯示出亂碼的情況下,可以安裝poppler-data來解決:

        sudo apt-get install poppler-data

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章