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