Computer:字符編碼(ASCII編碼/GBK編碼/BASE64編碼/UTF-8編碼)的簡(jiǎn)介,、案例應(yīng)用(python中的編碼格式及常見(jiàn)編碼問(wèn)題詳解)之詳細(xì)攻略
符串編碼(ASCII編碼/GBK編碼/BASE64編碼/UTF-8編碼)的簡(jiǎn)介
? ? ? ? ?符編碼(Character encoding)也稱字集碼,是把字符集中的字符編碼為指定集合中某一對(duì)象(例如:比特模式,、自然數(shù)序列、8位組或者電脈沖),以便文本在計(jì)算機(jī)中存儲(chǔ)和通過(guò)通信網(wǎng)絡(luò)的傳遞,。常見(jiàn)的例子包括將拉丁字母表編碼成摩斯電碼和ASCII,。其中,ASCII將字母,、數(shù)字和其它符號(hào)編號(hào),并用7比特的二進(jìn)制來(lái)表示這個(gè)整數(shù)。通常會(huì)額外使用一個(gè)擴(kuò)充的比特,以便于以1個(gè)字節(jié)的方式存儲(chǔ),。 ? ? ? ? ?在計(jì)算機(jī)技術(shù)發(fā)展的早期,如ASCII(1963年)和EBCDIC(1964年)這樣的字符集逐漸成為標(biāo)準(zhǔn)。但這些字符集的局限很快就變得明顯,于是人們開(kāi)發(fā)了許多方法來(lái)擴(kuò)展它們,。對(duì)于支持包括東亞CJK字符家族在內(nèi)的寫作系統(tǒng)的要求能支持更大量的字符,并且需要一種系統(tǒng)而不是臨時(shí)的方法實(shí)現(xiàn)這些字符的編碼,。
1、案例理解編碼的原理
? ? ? ? ?在顯示器上看見(jiàn)的文字,、圖片等信息在電腦里面其實(shí)并不是我們看見(jiàn)的樣子,即使你知道所有信息都存儲(chǔ)在硬盤里,把它拆開(kāi)也看不見(jiàn)里面有任何東西,只有些盤片,。 ? ? ? ? ?假設(shè),你用顯微鏡把盤片放大,會(huì)看見(jiàn)盤片表面凹凸不平,凸起的地方被磁化,凹的地方是沒(méi)有被磁化;凸起的地方代表數(shù)字1,凹的地方代表數(shù)字0。硬盤只能用0和1來(lái)表示所有文字,、圖片等信息,。 ? ? ? ? ?那么字母”A”在硬盤上是如何存儲(chǔ)的呢?可能小張計(jì)算機(jī)存儲(chǔ)字母”A”是1100001,而小王存儲(chǔ)字母”A”是11000010,這樣雙方交換信息時(shí)就會(huì)誤解。比如小張把1100001發(fā)送給小王,小王并不認(rèn)為1100001是字母”A”,可能認(rèn)為這是字母”X”,于是小王在用記事本訪問(wèn)存儲(chǔ)在硬盤上的1100001時(shí),在屏幕上顯示的就是字母”X”,。 ? ? ? ? ?也就是說(shuō),小張和小王使用了不同的編碼表,。小張用的編碼表是ASCII,ASCII編碼表把26個(gè)字母都一一的對(duì)應(yīng)到二進(jìn)制1和0上;小王用的編碼表可能是EBCDIC,只不過(guò)EBCDIC編碼與ASCII編碼中的字母和01的對(duì)應(yīng)關(guān)系不同。
以上源自百度百科:字符編碼_百度百科
2,、不同編碼對(duì)比
字符編碼 | 時(shí)間 | 簡(jiǎn)介 | ASCII編碼 | 1961 | ASCII 是 American Standard Code for Information Interchange 的縮寫,美國(guó)(國(guó)家)信息交換標(biāo)準(zhǔn)(代)碼,一種使用7個(gè)或8個(gè)二進(jìn)制位進(jìn)行編碼的方案,最多可以給256個(gè)字符(包括字母,、數(shù)字、標(biāo)點(diǎn)符號(hào),、控制字符及其他符號(hào))分配(或指定)數(shù)值,。 基本的 ASCII?字符集共有 128 個(gè)字符,其中有 96 個(gè)可打印字符,包括常用的字母、數(shù)字,、標(biāo)點(diǎn)符號(hào)等,另外還有 32 個(gè)控制字符,。 (1)、一個(gè)字節(jié),255字符,。米國(guó)人在設(shè)計(jì)這個(gè)編碼的時(shí)候,以為世界上只有英語(yǔ)一種語(yǔ)言,所以足夠表達(dá)26個(gè)字母+9個(gè)數(shù)字+各種標(biāo)點(diǎn)符號(hào)了,。ASCII 碼使用指定的7 位或8 位二進(jìn)制數(shù)組合來(lái)表示128 或256 種可能的字符。 (2),、主要用于顯示現(xiàn)代英語(yǔ)和其他西歐語(yǔ)言,。它是現(xiàn)今最通用的單字節(jié)編碼系統(tǒng)。 | MBCS編碼/ANSI 編碼 | | 為了擴(kuò)充ASCII編碼,以用于顯示本國(guó)的語(yǔ)言,不同的國(guó)家和地區(qū)制定了不同的標(biāo)準(zhǔn),由此產(chǎn)生了 GB2312, BIG5, JIS 等各自的編碼標(biāo)準(zhǔn),。這些使用 2 個(gè)字節(jié)來(lái)代表一個(gè)字符的各種漢字延伸編碼方式,稱為 ANSI 編碼,又稱為"MBCS(Muilti-Bytes Character Set,多字節(jié)字符集)",。在簡(jiǎn)體中文系統(tǒng)下,ANSI 編碼代表 GB2312 編碼,在日文操作系統(tǒng)下,ANSI 編碼代表 JIS 編碼,所以在中文 windows下要轉(zhuǎn)碼成gb2312,gbk只需要把文本保存為ANSI 編碼即可。 在簡(jiǎn)體中文系統(tǒng)下,ANSI 編碼代表 GB2312 編碼,在日文操作系統(tǒng)下,ANSI 編碼代表 JIS 編碼,。 | GB2312編碼 | 1980 | GB2312 也是ANSI編碼里的一種,對(duì)ANSI編碼最初始的ASCII編碼進(jìn)行擴(kuò)充,為了滿足國(guó)內(nèi)在計(jì)算機(jī)中使用漢字的需要,中國(guó)國(guó)家標(biāo)準(zhǔn)總局發(fā)布了一系列的漢字字符集國(guó)家標(biāo)準(zhǔn)編碼,統(tǒng)稱為GB碼,或國(guó)標(biāo)碼,。 (1)、GB2312編碼通行于我國(guó)內(nèi)陸;新加坡等地也采用此編碼,。幾乎所有的中文系統(tǒng)和國(guó)際化的軟件都支持GB 2312,。 ------------------------------------------------------------- GB 2312的出現(xiàn),基本滿足了漢字的計(jì)算機(jī)處理需要,但對(duì)于人名,、古漢語(yǔ)等方面出現(xiàn)的罕用字,GB 2312不能處理,這導(dǎo)致了后來(lái)GBK及GB 18030漢字字符集的出現(xiàn)。 | GBK編碼 | 1980 | GBK即漢字內(nèi)碼擴(kuò)展規(guī)范,K為擴(kuò)展的漢語(yǔ)拼音中“擴(kuò)”字的聲母,。英文全稱Chinese Internal Code Specification,。GBK編碼標(biāo)準(zhǔn)兼容GB2312,共收錄漢字21003個(gè)、符號(hào)883個(gè),并提供1894個(gè)造字碼位,簡(jiǎn),、繁體字融于一庫(kù),。GB2312碼是中華人民共和國(guó)國(guó)家漢字信息交換用編碼。 兩個(gè)字節(jié),GB2312(6000常用字)→GB18030(2W+字),。 (1),、Windows系統(tǒng)默認(rèn)編碼格式,windows系統(tǒng)默認(rèn)編碼為GBK; | BASE64編碼 | | 為了能讓郵件系統(tǒng)正常的收發(fā)信件,就需要把由其他編碼存儲(chǔ)的符號(hào)轉(zhuǎn)換成ASCII碼來(lái)傳輸。比如,在一端發(fā)送GB2312編碼->根據(jù)Base64規(guī)則->轉(zhuǎn)換成ASCII碼,接收端收到ASCII碼->根據(jù)Base64規(guī)則->還原到GB2312編碼,。 | UNICODE編碼 | | 世界上存在著多種編碼方式,在ANSi編碼下,同一個(gè)編碼值,在不同的編碼體系里代表著不同的字,。在簡(jiǎn)體中文系統(tǒng)下,ANSI 編碼代表 GB2312 編碼,在日文操作系統(tǒng)下,ANSI 編碼代表 JIS 編碼,可能最終顯示的是中文,也可能顯示的是日文。對(duì)同一個(gè)二進(jìn)制編碼值進(jìn)行顯示,采用了不同的編碼,導(dǎo)致亂碼,。這個(gè)問(wèn)題促使了unicode碼的誕生,。 如果有一種編碼,將世界上所有的符號(hào)都納入其中,無(wú)論是英文、日文,、還是中文等,大家都使用這個(gè)編碼表,就不會(huì)出現(xiàn)編碼不匹配現(xiàn)象,。Unicode固然統(tǒng)一了編碼方式,但是它的效率不高。 | UTF-8編碼 | | 為了提高Unicode的編碼效率,于是就出現(xiàn)了UTF-8編碼,。UTF-8可以根據(jù)不同的符號(hào)自動(dòng)選擇編碼的長(zhǎng)短,。比如英文字母可以只用1個(gè)字節(jié)就夠了。 兩個(gè)字節(jié)ISO?,國(guó)際標(biāo)準(zhǔn)化組織,。unicode指的是萬(wàn)國(guó)碼,是一種“字碼表”,而utf-8是這種字碼表儲(chǔ)存的其中一種編碼方法,。把多國(guó)語(yǔ)言都統(tǒng)一到一套編碼,其中UTF-8編碼節(jié)省空間,還有UTF-16、UTF-32,。 (1),、Linux系統(tǒng)的Ubuntu默認(rèn)為UTF-8; (2)、PyQt軟件中默認(rèn)的編碼格式; |
python中的編碼格式及常見(jiàn)編碼問(wèn)題詳解
Python2默認(rèn)的編碼是ASCII,而Python3默認(rèn)的是utf-8,。 (1),、Python中字符串類型分為byte string 和 unicode string兩種。 (2),、Python進(jìn)行同時(shí)包含 str 與 unicode 的運(yùn)算時(shí),Python 一律都把 str 轉(zhuǎn)換成 unicode 再運(yùn)算,當(dāng)然,運(yùn)算結(jié)果也都是 unicode,。由于 Python 事先并不知道 str 的編碼,它只能使用 sys.getdefaultencoding() 編碼去 decode。 (3),、一般情況下,sys.getdefaultencoding() 的值總是 'ascii' ——顯然,如果需要轉(zhuǎn)換的 str 有中文,一定會(huì)出現(xiàn)錯(cuò)誤,。對(duì)于這個(gè)問(wèn)題,建議在代碼里的中文字符串前寫上 u。 (4),、在 Python 3 已經(jīng)取消了 str,讓所有的字符串都是 unicode,這也許是個(gè)正確的決定,。
1,、查看、設(shè)置python默認(rèn)編碼
import?sys res = sys.getdefaultencoding() ??#sys.setdefaultencoding('utf-8')設(shè)置默認(rèn)格式為utf8 print(res)
2,、如果默認(rèn)是ascii編碼,輸出中文時(shí),肯定出現(xiàn)編碼錯(cuò)誤
將輸出的字符串轉(zhuǎn)為unicode編碼,或者格式化為unicode編碼,然后輸出
my_str?= self.lineEdit.text() self.textBrowser.append(my_str) print(unicode(self.lineEdit.text()))
my_str?= self.lineEdit.text() self.textBrowser.append(my_str) print(u'%s'%self.lineEdit.text())
3,、解決輸出字符串亂碼問(wèn)題
f?= open(unicode(my_file), 'a+') f.write(unicode(my_data).encode('utf8'))
|