今天把Windows上的文件傳到Linux上,通過(guò)cat打開(kāi)后,出現(xiàn)亂碼,如下圖

出現(xiàn)亂碼的原因是由于兩個(gè)操作系統(tǒng)對(duì)中文的壓縮方式不同,Linux下使用的是utf8,而Windows使用的是.gbbk,因此Windows下正常顯示的文件再Linux中打開(kāi)出現(xiàn)亂碼。
解決方法一:
在Linux終端輸入: ? iconv -f gbk -t utf8 PythonStudy.txt > Python.txt.utf8
在當(dāng)前目錄下就生成了一個(gè).utf8格式的文件,打開(kāi)該文件,正常顯示,如下圖

解決方法二:
切換至root用戶,用vim打開(kāi)vimrc文件 ??
vim /etc/vimrc
在文件的末尾加入以下內(nèi)容:
set fileencodings=utf-8,gb2312,gbk,gb18030
set termencoding=utf-8
set fileformats=unix
set encoding=prc
保存退出,再使用vim打開(kāi)就可以識(shí)別gb2312的中文文件
但是使用cat等打開(kāi)仍然亂碼
解決方法三:
用記事本打開(kāi)文件,點(diǎn)擊另存為,在下方的編碼方式中選擇utf-8方式
那么多種編碼格式,有些理不清,那就再來(lái)看看字符編碼方式的發(fā)展歷程吧
字符編碼發(fā)展史
1、最開(kāi)始,計(jì)算機(jī)由8個(gè)晶體管表示狀態(tài),可表示的范圍為0 - 256,稱其為“字節(jié)”
2、計(jì)算機(jī)誕生于美國(guó),他們把編號(hào)從0開(kāi)始的32種狀態(tài)分別規(guī)定了特殊的用途,稱為“控制碼”,如00×10, 換行;把所有的空格、標(biāo)點(diǎn)符號(hào)、數(shù)字、大小寫(xiě)字母分別用連續(xù)的字節(jié)狀態(tài)表示,一直編到了第127號(hào),這樣就能用不同的字節(jié)來(lái)存儲(chǔ)英語(yǔ)的文字了。大家把這套方案叫做Ascii編碼
3、計(jì)算機(jī)迅速的發(fā)展,世界各地開(kāi)始使用計(jì)算機(jī),但是很多國(guó)家不是用的英文,他們的字母很多是ASCII碼中沒(méi)有的,因此用127后面的空位來(lái)表示這些新的字母,符號(hào)等,從128到255這一頁(yè)的字符集被稱”擴(kuò)展字符集”
4、中國(guó)人得到計(jì)算機(jī)時(shí),已經(jīng)沒(méi)有可以利用的字節(jié)狀態(tài)來(lái)表示漢字,于是中國(guó)人毫不客氣的把127后面的奇異符號(hào)直接取消,并規(guī)定:一個(gè)小于127的字符的意義與原來(lái)相同,但兩個(gè)大于127的字符連在一起時(shí),就表示一個(gè)漢字,前面的一個(gè)字節(jié)(他稱之為高字節(jié))從0xA1用到 0xF7,后面一個(gè)字節(jié)(低字節(jié))從0xA1到0xFE,這樣我們就可以組合出大約7000多個(gè)簡(jiǎn)體漢字了。在這些編碼里,我們還把數(shù)學(xué)符號(hào)、羅馬希臘的字母、日文的假名們都編進(jìn)去了,連在 ASCII 里本來(lái)就有的數(shù)字、標(biāo)點(diǎn)、字母都統(tǒng)統(tǒng)重新編了兩個(gè)字節(jié)長(zhǎng)的編碼,這就是常說(shuō)的”全角”字符,而原來(lái)在127號(hào)以下的那些就叫”半角”字符了。
中國(guó)人民把這種漢字方案叫做 “GB2312″。GB2312 是對(duì) ASCII 的中文擴(kuò)展。
5、中國(guó)的漢字太多了,還是有很多人的名字沒(méi)辦法打出來(lái),于是干脆不再要求低字節(jié)一定是127號(hào)之后的內(nèi)碼,只要第一個(gè)字節(jié)是大于127就固定表示這是一個(gè)漢字的開(kāi)始,不管后面跟的是不是擴(kuò)展字符集里的內(nèi)容。結(jié)果擴(kuò)展之后的編碼方案被稱為 GBK 標(biāo)準(zhǔn),GBK 包括了 GB2312 的所有內(nèi)容,同時(shí)又增加了近20000個(gè)新的漢字(包括繁體字)和符號(hào)
6、少數(shù)名族也開(kāi)始用電腦了,于是再擴(kuò)展,又加了幾千個(gè)新的少數(shù)民族的字,GBK 擴(kuò)成了GB18030
7、各個(gè)國(guó)家都像中國(guó)這樣搞出一套自己的編碼標(biāo)準(zhǔn),結(jié)果互相之間誰(shuí)也不懂誰(shuí)的編碼,誰(shuí)也不支持別人的編碼。這時(shí)候,ISO(國(guó)際標(biāo)準(zhǔn)化組織)開(kāi)始著手解決這個(gè)問(wèn)題。他們的方法很簡(jiǎn)單:廢了所有的地區(qū)性編碼方案,重新搞一個(gè)包括了地球上所有文化、所有字母和符號(hào)的編碼!即UNICODE。UNICODE 包持其原編碼不變,只是將其長(zhǎng)度由原來(lái)的8位擴(kuò)展為16位,而其他文化和語(yǔ)言的字符則全部重新統(tǒng)一編碼。
8、由于”半角”英文符號(hào)只需要用到低8位,所以其高 8位永遠(yuǎn)是0,因此這種大氣的方案在保存英文文本時(shí)會(huì)多浪費(fèi)一倍的空間。為了解決這個(gè)問(wèn)題,UTF-8出現(xiàn)了,這是一種針對(duì)Unicode的可變長(zhǎng)度字符編碼。UTF-8的編碼規(guī)則很簡(jiǎn)單,只有二條:
a、對(duì)于單字節(jié)的符號(hào),字節(jié)的第一位設(shè)為0,后面7位為這個(gè)符號(hào)的unicode碼。因此對(duì)于英語(yǔ)字母,UTF-8編碼和ASCII碼是相同的;
b、對(duì)于n字節(jié)的符號(hào)(n>1),第一個(gè)字節(jié)的前n位都設(shè)為1,第n+1位設(shè)為0,后面字節(jié)的前兩位一律設(shè)為10。剩下的沒(méi)有提及的二進(jìn)制位,全部為這個(gè)符號(hào)的unicode碼。
因此大量只支持ASCII編碼的歷史遺留軟件可以在UTF-8編碼下繼續(xù)工作,utf-8被普遍使用
參考:
blog.chinaunix.net/uid-27177626-id-3496705.html
blog.csdn.net/wwwdongzi/article/details/17002839