python3.x編碼解碼unicode字符串的實(shí)現(xiàn)示例
python的ASCII碼范圍為[0,127],非ASCII碼范圍大于127.
通過(guò)str.encode(encoding)和bytes(str,encoding)根據(jù)編碼名將字符串編碼為原始字節(jié)。
通過(guò)bytes.decode(encoding)和str(bytes,encoding)根據(jù)編碼名將原始字節(jié)解碼為字符串。
gbk編碼中,1個(gè)漢字表示2個(gè)字節(jié),utf-8編碼中,1個(gè)漢字表示3個(gè)字節(jié)。
1個(gè)字節(jié)用2位16進(jìn)制表示。編碼和解碼必須送編碼名encoding。
‘\xNN’為兩個(gè)十六進(jìn)制,表示1個(gè)字節(jié),
’\uNNNN’為unicode轉(zhuǎn)義,表示四個(gè)十六進(jìn)制位,編碼1個(gè)2字節(jié)(16位)字符碼,
’\UNNNNNNNN’為unicode轉(zhuǎn)義,表示八個(gè)十六進(jìn)制位,編碼1個(gè)4字節(jié)(32位)字符碼,
2個(gè)16進(jìn)制對(duì)應(yīng)1個(gè)字節(jié)。
注意,2字節(jié)用小u(\u),4字節(jié)用大U(\U)。
1 編碼ASCII文本
ASCII文本編碼是一種Unicode,存儲(chǔ)為表示字符的字節(jié)值的一個(gè)序列。
ASCII碼范圍0-127.通過(guò)編碼后,在字符前加b或B,打印值和字符相同。
>>> ord('a') 97 >>> chr(97) 'a' >>> s='abc' >>> s 'abc' >>> len(s) 3 >>> [ord(c) for c in s] [97, 98, 99] >>> s.encode('ascii') b'abc' >>> s.encode('gbk') b'abc' >>> s.encode('utf-8') b'abc' >>> b_asc=s.encode('ascii') >>> b_gbk=s.encode('gbk') >>> b_utf8=s.encode('utf-8') >>> list(map(list,(b_asc,b_gbk,b_utf8))) [[97, 98, 99], [97, 98, 99], [97, 98, 99]]
2 編碼非ASCII文本
編碼非ASCII字符(編碼值大于127),需用十六進(jìn)制或Unicode轉(zhuǎn)義。
十六進(jìn)制轉(zhuǎn)義用于單字節(jié),Unicode用于兩個(gè)或四個(gè)字節(jié)。
示例
>>> a,b=0xa5,0xa9 >>> a,b (165, 169) >>> hex(a),hex(b) ('0xa5', '0xa9') >>> chr(a),chr(b) ('¥', '?') # \xNN 十六進(jìn)制單字節(jié)格式 >>> s1='\xa5\xa9' # \uNNNN Unicode 雙字節(jié)格式 >>> s2='\u00a5\u00a9' >>> s1,s2 ('¥?', '¥?') >>> len(s1),len(s2) (2, 2) # \UNNNNNNNN Unicode 四字節(jié)格式 >>> s3='\U000000a5' >>> s3 '¥'
3 編碼和解碼非ASCII文本
描述
# | 項(xiàng)目 | 描述 |
---|---|---|
1 | \xNN | 2位16進(jìn)制,表示單字節(jié),用\x轉(zhuǎn)義,表示ASCII文本的unicode |
2 | \uNNNN | 4位16進(jìn)制,表示雙字節(jié),用\u轉(zhuǎn)義,表示非ASCII文本的unicode |
3 | \UNNNNNNNN | 8位16進(jìn)制,表示四字節(jié),用\U轉(zhuǎn)義,表示非ASCII文本的unicode |
4 | 單字節(jié) | 1個(gè)字節(jié)2位16進(jìn)制 |
5 | ASCII編碼 | 范圍[0-127] |
6 | 非ASCII編碼 | 范圍大于127 |
7 | gbk編碼 | 1個(gè)漢字2個(gè)字節(jié),1個(gè)字節(jié)2位16進(jìn)制 |
8 | utf-8編碼 | 1個(gè)漢字3個(gè)字節(jié),1個(gè)字節(jié)2位16進(jìn)制 |
9 | unicode文本 | python3.x的字符串str為unicode文本 |
10 | ord© | 獲取字符c的unicode編碼,為整數(shù) |
11 | hex(i) | 獲取整數(shù)i的16進(jìn)制 |
12 | hex(ord©) | 獲取字符c的unicode編碼的16進(jìn)制,用\u轉(zhuǎn)義 |
13 | str.encode(encoding) | 根據(jù)編碼名encoding將字符串str編碼為原始字節(jié),返回bytes類(lèi)型數(shù)據(jù),b或B開(kāi)頭 |
14 | bytes.decode(encoding) | 根據(jù)編碼名encoding將原始字節(jié)解碼為字符串,返回str類(lèi)型數(shù)據(jù) |
15 | bytes(str,encoding) | 根據(jù)編碼名encoding將字符串str編碼為原始字節(jié),返回bytes類(lèi)型數(shù)據(jù),b或B開(kāi)頭 |
16 | str(bytes,encoding) | 根據(jù)編碼名encoding將原始字節(jié)解碼為字符串,返回str類(lèi)型數(shù)據(jù) |
示例
>>> c1,c2='梯','閱' # \xNN 16進(jìn)制單字節(jié), \uNNNN 16進(jìn)制雙字節(jié) , \UNNNNNNNN 16進(jìn)制四字節(jié) >>> c1_hexstr,c2_hexstr=hex(ord(c1)),hex(ord(c2)) # ord(c)獲取c的unicode值,通過(guò)hex(i)獲取unicode值的16進(jìn)制 >>> c1_hexstr,c2_hexstr ('0x68af', '0x9605') # \uNNNN 四位16進(jìn)制表示的2個(gè)字節(jié),1個(gè)漢字為2個(gè)字節(jié)的unicode # 每個(gè)字節(jié)的unicode 用\u 轉(zhuǎn)義 原始字節(jié) >>> c1c2='\u68af\u9605' >>> c1c2 '梯閱' >>> len(c1c2) 2 # ASCII 范圍為[0,127] >>> c1c2.encode('ascii') Traceback (most recent call last): File "<pyshell#82>", line 1, in <module> c1c2.encode('ascii') UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128) # 通過(guò) 編碼名 gbk 的碼表編碼, 1個(gè) 漢字為2個(gè)字節(jié) ,1個(gè)字節(jié)為2位16進(jìn)制 # str.encode(encoding) 根據(jù)編碼名 將字符串編碼為原始字節(jié) >>> c1c2.encode('gbk') b'\xcc\xdd\xd4\xc4' >>> '梯閱'.encode('gbk') b'\xcc\xdd\xd4\xc4' # 通過(guò) 編碼名 utf-8 的碼表編碼,1個(gè) 漢字為 3個(gè)字節(jié),1個(gè)字節(jié)為2位16進(jìn)制 >>> c1c2.encode('utf-8') b'\xe6\xa2\xaf\xe9\x98\x85' >>> type(c1c2.encode('utf-8')) <class 'bytes'> >>> bytes(c1c2,encoding='utf-8') b'\xe6\xa2\xaf\xe9\x98\x85' >>> gbk_c1c2_raw=b'\xcc\xdd\xd4\xc4' >>> utf8_c1c2_raw=b'\xe6\xa2\xaf\xe9\x98\x85' >>> len(gbk_c1c2_raw),len(utf8_c1c2_raw) (4, 6) # bytes.decode(encoding) 根據(jù)編碼名 將原始字節(jié)解碼為字符串 >>> gbk_c1c2_dcd=gbk_c1c2_raw.decode('gbk') >>> utf8_c1c2_dcd=utf8_c1c2_raw.decode('utf-8') >>> gbk_c1c2_dcd,utf8_c1c2_dcd ('梯閱', '梯閱') >>> str(gbk_c1c2_raw,encoding='gbk') '梯閱' >>> len(gbk_c1c2_dcd),len(utf8_c1c2_dcd) (2, 2)
到此這篇關(guān)于python3.x編碼解碼unicode字符串的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)python3.x編碼解碼unicode內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決json中ensure_ascii=False的問(wèn)題
這篇文章主要介紹了解決json中ensure_ascii=False的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04Django用戶(hù)認(rèn)證系統(tǒng) 組與權(quán)限解析
這篇文章主要介紹了Django用戶(hù)認(rèn)證系統(tǒng) 組與權(quán)限解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08Python自動(dòng)安裝第三方庫(kù)的小技巧(pip使用詳解)
很多朋友私信小編Python安裝第三方庫(kù)安裝技巧,在這就不一一回復(fù)大家了,今天小編給大家分享一篇教程關(guān)于Python自動(dòng)安裝第三方庫(kù)的小技巧,本文以安裝plotly為例給大家詳細(xì)講解,感興趣的朋友跟隨小編一起看看吧2021-05-05python pandas dataframe 去重函數(shù)的具體使用
這篇文章主要介紹了python pandas dataframe 去重函數(shù)的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07Python裝飾器實(shí)現(xiàn)幾類(lèi)驗(yàn)證功能做法實(shí)例
下面小編就為大家?guī)?lái)一篇Python裝飾器實(shí)現(xiàn)幾類(lèi)驗(yàn)證功能做法實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05Python實(shí)現(xiàn)用networkx繪制MultiDiGraph
這篇文章主要介紹了Python實(shí)現(xiàn)用networkx繪制MultiDiGraph方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02Python Pandas 如何shuffle(打亂)數(shù)據(jù)
這篇文章主要介紹了Python Pandas 如何shuffle(打亂)數(shù)據(jù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07