小編給大家分享一下python中將亂碼解碼的方法,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!
成都創(chuàng)新互聯(lián)專注于杜爾伯特企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè),電子商務(wù)商城網(wǎng)站建設(shè)。杜爾伯特網(wǎng)站建設(shè)公司,為杜爾伯特等地區(qū)提供建站服務(wù)。全流程定制開發(fā),專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)
中文編碼問題一直是程序員頭疼的問題,而Python2中的字符編碼足矣令新手抓狂。本文將盡量用通俗的語言帶大家徹底的了解字符編碼
以及Python2和3中的各種編碼問題。
一、什么是字符編碼。
要徹底解決字符編碼的問題就不能不去了解到底什么是字符編碼。計(jì)算機(jī)從本質(zhì)上來說只認(rèn)識(shí)二進(jìn)制中的0和1,可以說任何數(shù)據(jù)在計(jì)算機(jī)
中實(shí)際的物理表現(xiàn)形式也就是0和1,如果你將硬盤拆開,你是看不到所謂的數(shù)字0和1的,你能看到的只是一塊光滑閃亮的磁盤,如果你
用足夠大的放大鏡你就能看到磁盤的表面有著無數(shù)的凹凸不平的元件,凹下去的代表0,突出的代表1,這就是計(jì)算機(jī)用來表現(xiàn)二進(jìn)制的方
式。
1.ASCII
現(xiàn)在我們面臨了第一個(gè)問題:如何讓人類語言,比如英文被計(jì)算機(jī)理解?我們以英文為例,英文中有英文字母(大小寫)、標(biāo)點(diǎn)符號(hào)、特
殊符號(hào)。如果我們將這些字母與符號(hào)給予固定的編號(hào),然后將這些編號(hào)轉(zhuǎn)變?yōu)槎M(jìn)制,那么計(jì)算機(jī)明顯就能夠正確讀取這些符號(hào),同時(shí)通
過這些編號(hào),計(jì)算機(jī)也能夠?qū)⒍M(jìn)制轉(zhuǎn)化為編號(hào)對(duì)應(yīng)的字符再顯示給人類去閱讀。由此產(chǎn)生了我們最熟知的ASCII碼。ASCII 碼使用指定
的7 位或8 位二進(jìn)制數(shù)組合來表示128 或256 種可能的字符。這樣在大部分情況下,英文與二進(jìn)制的轉(zhuǎn)換就變得容易多了。
2.GB2312
然而,雖然計(jì)算機(jī)是美國人發(fā)明的,但是全世界的人都在使用計(jì)算機(jī)?,F(xiàn)在出現(xiàn)了另一個(gè)問題:如何讓中文被計(jì)算機(jī)理解?這下麻煩了,
中文不像拉丁語系是由固定的字母排列組成的。ASCII 碼顯然沒辦法解決這個(gè)問題,為了解決這個(gè)問題中國國家標(biāo)準(zhǔn)總局1980年發(fā)布《信
息交換用漢字編碼字符集》提出了GB2312編碼,用于解決漢字處理的問題。1995年又頒布了《漢字編碼擴(kuò)展規(guī)范》(GBK)。GBK與
GB 2312—1980國家標(biāo)準(zhǔn)所對(duì)應(yīng)的內(nèi)碼標(biāo)準(zhǔn)兼容,同時(shí)在字匯一級(jí)支持ISO/IEC10646—1和GB 13000—1的全部中、日、韓(CJK)漢
字,共計(jì)20902字。這樣我們就解決了計(jì)算機(jī)處理漢字的問題了。
3.Unicode
現(xiàn)在英文和中文問題被解決了,但新的問題又出現(xiàn)了。全球有那么多的國家不僅有英文、中文還有阿拉伯語、西班牙語、日語、韓語等
等。難不成每種語言都做一種編碼?基于這種情況一種新的編碼誕生了:Unicode。Unicode又被稱為統(tǒng)一碼、萬國碼;它為每種語言中
的每個(gè)字符設(shè)定了統(tǒng)一并且唯一的二進(jìn)制編碼,以滿足跨語言、跨平臺(tái)進(jìn)行文本轉(zhuǎn)換、處理的要求。Unicode支持歐洲、非洲、中東、亞
洲(包括統(tǒng)一標(biāo)準(zhǔn)的東亞象形漢字和韓國表音文字)。這樣不管你使用的是英文或者中文,日語或者韓語,在Unicode編碼中都有收錄,
且對(duì)應(yīng)唯一的二進(jìn)制編碼。這樣大家都開心了,只要大家都用Unicode編碼,那就不存在這些轉(zhuǎn)碼的問題了,什么樣的字符都能夠解析
了。
4.UTF-8
但是,由于Unicode收錄了更多的字符,可想而知它的解析效率相比ASCII碼和GB2312的速度要大大降低,而且由于Unicode通過增加一
個(gè)高字節(jié)對(duì)ISO Latin-1字符集進(jìn)行擴(kuò)展,當(dāng)這些高字節(jié)位為0時(shí),低字節(jié)就是ISO Latin-1字符。對(duì)可以用ASCII表示的字符使用Unicode
并不高效,因?yàn)閁nicode比ASCII占用大一倍的空間,而對(duì)ASCII來說高字節(jié)的0對(duì)他毫無用處。為了解決這個(gè)問題,就出現(xiàn)了一些中間格
式的字符集,他們被稱為通用轉(zhuǎn)換格式,即UTF(Unicode Transformation Format)。而我們最常用的UTF-8就是這些轉(zhuǎn)換格式中的一
種。在這里我們不去研究UTF-8到底是如何提高效率的,你只需要知道他們之間的關(guān)系即可。
總結(jié):
1.為了處理英文字符,產(chǎn)生了ASCII碼。
2.為了處理中文字符,產(chǎn)生了GB2312。
3.為了處理各國字符,產(chǎn)生了Unicode。
4.為了提高Unicode存儲(chǔ)和傳輸性能,產(chǎn)生了UTF-8,它是Unicode的一種實(shí)現(xiàn)形式。
看完了這篇文章,相信你對(duì)python中將亂碼解碼的方法有了一定的了解,想了解更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!