閱讀目錄
一径簿、字符編碼
1、什么實(shí)字符編碼:將人識(shí)別的字符轉(zhuǎn)換成計(jì)算機(jī)能識(shí)別的01,而轉(zhuǎn)換的過(guò)程或者規(guī)則就是字符編碼表嘀韧。
而這種字符編碼表表示了一種對(duì)應(yīng)關(guān)系篇亭。
2、常用的字符編碼表有:ascii锄贷、unicode译蒂、GBK、Shift_JIS谊却、Euc-kr
3柔昼、如何理解字符編碼
①、電腦三大核心:cpu -內(nèi)存-硬盤
②捕透、軟件及Python解釋器讀取文件過(guò)程:?jiǎn)?dòng)–讀取–展示|解釋執(zhí)行
計(jì)算機(jī)只認(rèn)識(shí)數(shù)字
很明顯,我們平時(shí)在使用計(jì)算機(jī)時(shí)末购,用的都是人類能讀懂的字符(用高級(jí)語(yǔ)言編程的結(jié)果也無(wú)非是在文件內(nèi)寫了 一堆字符)虎谢,如何能讓計(jì)算機(jī)讀懂人類的字符?
必須經(jīng)過(guò)一個(gè)過(guò)程:
字符--------(翻譯過(guò)程)------->數(shù)字
這個(gè)過(guò)程實(shí)際就是一個(gè)字符如何對(duì)應(yīng)一個(gè)特定數(shù)字的標(biāo)準(zhǔn)曹货,這個(gè)標(biāo)準(zhǔn)稱之為字符編碼
計(jì)算機(jī)由美國(guó)人發(fā)明顶籽,最早的字符編碼為ASCII银觅,只規(guī)定了英文字母數(shù)字和一些特殊字符與數(shù)字的對(duì)應(yīng)關(guān)系。最多只能用 8 位來(lái)表示(一個(gè)字節(jié))镊绪,即:2**8 = 256洒忧,所以,ASCII碼最多只能表示 256 個(gè)符號(hào)
當(dāng)然我們編程語(yǔ)言都用英文沒問(wèn)題熙侍,ASCII夠用,但是在處理數(shù)據(jù)時(shí)庆尘,不同的國(guó)家有不同的語(yǔ)言巷送,日本人會(huì)在自己的程序中加入日文笑跛,中國(guó)人會(huì)加入中文。
而要表示中文抒抬,單拿一個(gè)字節(jié)表表示一個(gè)漢子晤柄,是不可能表達(dá)完的(連小學(xué)生都認(rèn)識(shí)兩千多個(gè)漢字)芥颈,解決方法只有一個(gè),就是一個(gè)字節(jié)用>8位2進(jìn)制代表纠屋,位數(shù)越多盾计,代表的變化就多,這樣族铆,就可以盡可能多的表達(dá)出不通的漢字
所以中國(guó)人規(guī)定了自己的標(biāo)準(zhǔn)gb2312編碼哭尝,規(guī)定了包含中文在內(nèi)的字符->數(shù)字的對(duì)應(yīng)關(guān)系。
日本人規(guī)定了自己的Shift_JIS編碼
韓國(guó)人規(guī)定了自己的Euc-kr編碼(另外逝淹,韓國(guó)人說(shuō)桶唐,計(jì)算機(jī)是他們發(fā)明的,要求世界統(tǒng)一用韓國(guó)編碼欣簇,但世界人民沒有搭理他們)
因?yàn)榇丝痰母鞣N標(biāo)準(zhǔn)都只是規(guī)定了自己國(guó)家的文字在內(nèi)的字符跟數(shù)字的對(duì)應(yīng)關(guān)系醉蚁,如果單純采用一種國(guó)家的編碼格式鬼店,那么其余國(guó)家語(yǔ)言的文字在解析時(shí)就會(huì)出現(xiàn)亂碼
所以迫切需要一個(gè)世界的標(biāo)準(zhǔn)(能包含全世界的語(yǔ)言)于是unicode應(yīng)運(yùn)而生
ascii用1個(gè)字節(jié)(8位二進(jìn)制)代表一個(gè)字符
unicode常用2個(gè)字節(jié)(16位二進(jìn)制)代表一個(gè)字符,生僻字需要用4個(gè)字節(jié)
這時(shí)候亂碼問(wèn)題消失了滥玷,所有的文檔我們都使用但是新問(wèn)題出現(xiàn)了惑畴,如果我們的文檔通篇都是英文航徙,你用unicode會(huì)比ascii耗費(fèi)多一倍的空間,在存儲(chǔ)和傳輸上十分的低效
本著節(jié)約的精神杠袱,又出現(xiàn)了把Unicode編碼轉(zhuǎn)化為“可變長(zhǎng)編碼”的UTF-8編碼。UTF-8編碼把一個(gè)Unicode字符根據(jù)不同的數(shù)字大小編碼成1-6個(gè)字節(jié)凿掂,常用的英文字母被編碼成1個(gè)字節(jié)庄萎,漢字通常是3個(gè)字節(jié)塘安,只有很生僻的字符才會(huì)被編碼成4-6個(gè)字節(jié)。如果你要傳輸?shù)奈谋景罅坑⑽淖址严郏肬TF-8編碼就能節(jié)省空間
4免都、字符編碼總結(jié):
unicode與utf-8采用的是一張unicode編碼表绕娘,utf-8是unicode編碼表體現(xiàn)方式,變長(zhǎng)存儲(chǔ)數(shù)據(jù)
變長(zhǎng)優(yōu)點(diǎn):(大量數(shù)據(jù)都是以英文存在侨舆,所以u(píng)tf-8空間更芯钅啊)傳輸速度更快
二、字符臭笆、編碼秤掌、解碼
u’ ’ Unicode字符串闻鉴,默認(rèn)字符
--------------------------------------------------------------------
注:如果你對(duì)python感興趣,我這有個(gè)學(xué)習(xí)Python基地瓶竭,里面有很多學(xué)習(xí)資料,感興趣的+Q群:895 797 751在验,
-------------------------------------------------------------------
s1 = u'abc你好\n不好' #\n代表?yè)Q行符
print(s1)
>>>
abc你好
不好
b’ ’ 字節(jié)字符串
s2 = b'abc123\xb7\xb7'
print(s2)
>>>b'abc123\xb7\xb7'
r’ ’ 原義字符串腋舌,不對(duì)字符串內(nèi)存做任何操作
s3 = r'abc你好\n不好'
print(s3)
>>>abc你好\n不好 #此時(shí)的換行符不起作用渗蟹,因?yàn)樵x字符串不做任何操作。
編碼encode與解碼decode:
編碼:我們能看懂的 編給機(jī)器 看 的過(guò)程
s='123哈哈'
s1=bytes(s,encoding='utf-8')
print(s1)
>>>b'123\xe5\x93\x88\xe5\x93\x88'
#結(jié)果解釋:這里的\x代表16進(jìn)制的意思授艰,一個(gè)16進(jìn)制需要占用4個(gè)bit世落,所以2個(gè)16進(jìn)制就是8個(gè)bit也就是1個(gè)字節(jié)(Bytes),所以\xe5代表2個(gè)16進(jìn)制一個(gè)字節(jié)谷朝,\x93武花、\x88各代表2個(gè)16進(jìn)制,一個(gè)字節(jié)专钉。后面三個(gè)重復(fù)累铅,所以用utf-8編碼,這里的一個(gè)漢字‘哈’占用3個(gè)字節(jié)
解碼:把機(jī)器能看懂的 解釋給我們?nèi)丝吹倪^(guò)程
b1= b'\xe4\xbd\xa0\xe5\xa5\xbd'
b2=str(b1,encoding='utf-8')
print(b2)
>>>你好
編碼菇民、解碼:
將u‘’字符串轉(zhuǎn)成b‘’字符串 編碼
u1=u'你好'
b1=u1.encode('utf-8')
print(b1)
>>>b'\xe4\xbd\xa0\xe5\xa5\xbd'
將b‘’字符轉(zhuǎn)換成u‘’字符 解碼
b2=b'\xe4\xbd\xa0\xe5\xa5\xbd'
u2=b2.decode('utf-8')
print(u2)
>>>你好