最近,學習又從新開始Linux學習,因此一直在Centos中,昨天一朋友把他在Windows下寫的C程序發給我,我欣然答應,本覺得很快就能在個人Linux系統中運行起來。沒想到出現了亂碼,結果想把這個問題解決,一會兒就搞了近三個小時沒有解決。今天,又想起來這個問題,居然一會兒就解決了,如今把學到的一些東西總結以下。html
首先Windows下的文件拿到Linux中來查看出現亂碼是一種很常見的現象,這方面的資料在網上也有不少。但解決方法大多都相似,有些概念沒有解釋清楚,也許是我的沒有理解清楚。vim
嘗試方法一:工具
一碰到這個問題,我想到的是Linux課上學到的一個命令dos2unix,之前也沒用過,此次用了也沒有解決問題。學習
由於,這個命令主要是用來處理Dos與Linux之間斷行的差別的。DOS下的文本文件是以\r\n做爲斷行標誌的,表示成十六進制就是0D 0A。而Unix下的文本文件是以\n做爲斷行標誌的,表示成十六進制就是 0A。有時咱們會遇到這樣一種狀況,dos下的文件在unix下顯示是不出現斷行,顯得很亂,這時用這個命令就OK。ui
後來在網上查了下,知道是編碼格式不一致致使的。由於Dos下編輯的文本默認是以GBK存儲的,而Linux默認採起的存儲方式是UTF-8,固然會出現亂碼了,可是如何去將Dos下的GBK文件轉換成UTF-8呢?編碼
嘗試方法二:更改Vim讀取時採用的編碼spa
先補充一個知識,參考博客http://blog.csdn.net/kl222/article/details/4550269.net
vim編碼方面的基礎知識:
存在3個變量:
encoding—-該選項使用於緩衝的文本(你正在編輯的文件),寄存器,Vim 腳本文件等等。你能夠把 'encoding' 選項看成是對 Vim 內部運行機制的設定。
fileencoding—-該選項是vim寫入文件時採用的編碼類型。
termencoding—-該選項表明輸出到客戶終端(Term)採用的編碼類型。unix
因此,我嘗試了在Vim中htm
: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
終於大功告成!
參考文獻:
[1].http://blog.csdn.net/kl222/article/details/4550269
[2].http://www.cnblogs.com/cosiray/archive/2012/05/04/2483111.html
[3].http://blog.chinaunix.net/uid-26786246-id-3636785.html