再談 Python字符串和編碼

字是給人看的而計算機(jī)只能處理數(shù)字。所以針對字需要編碼。

那么怎樣將字進(jìn)行編碼?

首先,挖了第一個坑,人們望著鍵盤上的字母、數(shù)字、符號掐指一算127個數(shù)字。 二進(jìn)制 2的8次方為 256 戳戳有余,于是乎規(guī)定了 1個二進(jìn)制位為1個 bit,8個二進(jìn)制位為一個字節(jié) byte,這樣一個 byte 就可以用二進(jìn)制最大數(shù)11111111 或者十進(jìn)制最大數(shù)255代表“所有的字”了。

然而,他們忽略了大洋彼岸的大中華,霓虹,大朝鮮這些字量巨大的文化大國。本著取資本主義精華的精神各國制定了自己的字編碼GB2312/Shift_JIS/Euc-kr 。然而問題來了,隨著亞洲全面崛起,文化不斷交流,中文+日文+韓文混用就會沖突(雖然日文假名本來就大量漢字).... 就會產(chǎn)生讓程序猿捉狂的亂碼。

這個時候,世界人民迫切需要一種包羅萬象的編碼,于是乎Unicode應(yīng)運(yùn)而生,怎么辦到的吶?一個 byte 不夠用,用兩個 byte 嘛,實在不行三個 byte…. 可是那個年代呀,存儲昂貴,帶寬昂貴,英文國家白白浪費(fèi)2倍加的空間呀,不能為了世界和平而自損三千呀。那怎么吶? 那就byte 變長唄。于是乎就變成了英文1個 byte,中文3個 byte,生僻字4-6個 byte,順便還兼容了ASCII。其中UTF-8(8-bit Unicode Transformation Format)作為一種針對Unicode的可變長度字符編碼,被廣泛應(yīng)用,完美收關(guān)。

回到 Python話題,歲月不饒人,在世界人民統(tǒng)一認(rèn)識到Unicode才是未來的時候已經(jīng)是1994年了。那么91年公開發(fā)布的 Python 自然默認(rèn)還是沿用了ASCII。 作為變通Python2里所有的非英文都使用了u'...' 代表Unicode字符串。直到2008的 Python3才統(tǒng)一使用Unicode。已是后話。

#!/usr/bin/env python2
# -*- coding: utf-8 -*-

>>> print u'非英文'
非英文

>>> u'非英文'
u'\u975e\u82f1\u6587'  

>>> u'非英文'.encode('utf-8')
'\xe9\x9d\x9e\xe8\x8b\xb1\xe6\x96\x87'  

>>> '\xe9\x9d\x9e\xe8\x8b\xb1\xe6\x96\x87'.decode('utf-8')
u'\u975e\u82f1\u6587'

>>> print u'\u975e\u82f1\u6587'
非英文

漂亮的分割線

2008年,祖國承辦了盛大的奧林匹克運(yùn)動大會。Python3也邁進(jìn)了Unicode,從此

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

>>> print("北京歡迎你") # 因為Unicode 所以默認(rèn)就支持了中文
北京歡迎你

>>> "北京歡迎你".encode('utf-8')   # 字符串編碼為字節(jié)流
b'\xe5\x8c\x97\xe4\xba\xac\xe6\xac\xa2\xe8\xbf\x8e\xe4\xbd\xa0'

>>>b'\xe5\x8c\x97\xe4\xba\xac\xe6\xac\xa2\xe8\xbf\x8e\xe4\xbd\xa0'.decode('utf-8')  #從字節(jié)流解碼為字符串
'北京歡迎你'

現(xiàn)在,Python 的字符串類型str,在計算機(jī)內(nèi)存中以Unicode表示,傳輸?shù)骄W(wǎng)絡(luò)或者保存到磁盤,需要將str字符串轉(zhuǎn)成例如encode('utf-8')以字節(jié)為單位的bytes。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容