Windows轉到linux中,檔案亂碼,檔案編碼轉換

YatHo發表於2017-03-16

最近,學習又重新開始Linux學習,所以一直在Centos中,昨天一朋友把他在Windows下寫的C程式發給我,我欣然答應,本以為很快就能在我的Linux系統中執行起來。沒想到出現了亂碼,結果想把這個問題解決,一下子就搞了近三個小時沒有解決。今天,又想起來這個問題,竟然一下子就解決了,現在把學到的一些東西總結如下。

 

首先Windows下的檔案拿到Linux中來檢視出現亂碼是一種很常見的現象,這方面的資料在網上也有很多。但解決方法大多都類似,有些概念沒有解釋清楚,也許是個人沒有理解清楚。

嘗試方法一:

一碰到這個問題,我想到的是Linux課上學到的一個命令dos2unix,以前也沒用過,這次用了也沒有解決問題。

因為,這個命令主要是用來處理Dos與Linux之間斷行的差異的。DOS下的文字檔案是以\r\n作為斷行標誌的,表示成十六進位制就是0D 0A。而Unix下的文字檔案是以\n作為斷行標誌的,表示成十六進位制就是 0A。有時我們會遇到這樣一種情況,dos下的檔案在unix下顯示是不出現斷行,顯得很亂,這時用這個命令就OK。

後來在網上查了下,知道是編碼格式不一致導致的。因為Dos下編輯的文字預設是以GBK儲存的,而Linux預設採取的儲存方式是UTF-8,當然會出現亂碼了,但是如何去將Dos下的GBK檔案轉換成UTF-8呢?

 

嘗試方法二:更改Vim讀取時採用的編碼

先補充一個知識,參考部落格http://blog.csdn.net/kl222/article/details/4550269

 

vim編碼方面的基礎知識:
存在3個變數:
encoding—-該選項使用於緩衝的文字(你正在編輯的檔案),暫存器,Vim 指令碼檔案等等。你可以把 'encoding' 選項當作是對 Vim 內部執行機制的設定。
fileencoding—-該選項是vim寫入檔案時採用的編碼型別。
termencoding—-該選項代表輸出到客戶終端(Term)採用的編碼型別。

 

所以,我嘗試了在Vim中

:set encoding

:set fileencoding=utf-8          #讓Vim將gbk的文字轉換成utf-8後,顯示出來

 

經過這樣改了之後,果然,Vim中看到的亂碼消失了,此時心情小小的激動了一下子。

但是,當我退出Vim再次開啟檔案時,亂碼又出現了,原來是我更改的Vim設定只是臨時的,所以我決定將其寫死到vim配置檔案當中去,操作如下:

編輯~/.vimrc檔案,加上如下幾行:

set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936

set termencoding=utf-8

set encoding=utf-8

 

這時,每次用Vim開啟檔案時都不出現亂碼了,本以為問題解決了,我開始編譯程式,當我執行的時候,亂碼還是出現了。。。。此時,欲哭無淚

 

後來,我仔細想了一下,我更改Vim的配置,只是讓我們看到的沒有亂碼,但從根本上講,檔案的編碼方式還是沒有變,所以當我用gcc編譯後,檔案的編碼格式應該還是gbk的。這樣導致的亂碼。所以,我決定找個工具,直接講gbk檔案轉換成utf-8。

 

嘗試三:

1.檢視檔案儲存格式

#file test.cpp

test.cpp: ISO-8859 English text, with CRLF line terminators

可以看出檔案是以ISO-8859儲存的。

2.檢視系統語言設定

#cat /etc/sysconfig/i18n

LANG="en_US.UTF-8"
SYSFONT="latarcyrheb-sun16"
可以看出Linux是以UTF-8編碼的

3.利用工具將檔案從ISO-8859轉換成UTF-8(這裡我採用的是iconv命令)

#iconv -f ISO-8859 -t UTF-8 test.c -o test_u.c

這時竟然出現了一個錯誤:

iconv: conversion from `ISO-8859' is not supported

Try `iconv --help' or `iconv --usage

解決方案:

將ISO-8859換成GBK

#iconv -f GBK -t UTF-8 test.c -o test_u.c

相關文章