python中的編碼和解碼及\x和\u問題
編碼和解碼及\x和\u問題
“字符在內(nèi)存里的表示是unicode,如果要存盤或者發(fā)到網(wǎng)絡(luò)就經(jīng)過utf-8,然后對(duì)端收到依次解碼。”
Python 3里面,str在內(nèi)存里是unicode表示的
‘中文’ == ‘\u4e2d\u6587’
'中文'.encode('utf-8') b'\xe4\xb8\xad\xe6\x96\x87' ?'\u4e2d\u6587'.encode('utf-8') b'\xe4\xb8\xad\xe6\x96\x87'
1個(gè)漢字用unicode表示一般是2個(gè)byte,
例如:
‘中’=\u4e2d(十六進(jìn)制寫法【即2bytes】)
'A'.encode('ascii') >>>b'A' ('\u0041').encode('ascii') >>>b'A' 'A'.encode('utf-8') >>>b'A'
note: b’A’和’A’
在python 3中
b’A’是ascii編碼的01010101的字節(jié),占1個(gè)byte;
'A‘是在內(nèi)存里按unicode形式編碼的/ucc,占的是2個(gè)byte。
unicode編碼后是bytes,如果這個(gè)字節(jié)范圍不在ascii的表示范圍內(nèi),就會(huì)顯示成\x(十六進(jìn)制形式)
例如:
- 漢字編碼成bytes,去查看這個(gè)bytes肯定只能看到\x系列,因?yàn)檫@個(gè)bytes的內(nèi)容肯定不在ascii范圍內(nèi);
- 英文編碼成bytes可以看到對(duì)應(yīng)的英文字母,本質(zhì)上它還是沒有含義的010101的字節(jié)流而不是字符。
"abc".encode('utf-8') b'abc' '中文'.encode('utf-8') b'\xe4\xb8\xad\xe6\x96\x87' 1個(gè)漢字,按utf-8編碼,一般是3個(gè)bytes,\xe4是十六進(jìn)制表示的1個(gè)byte。
相同的英文字符,ascii編碼和utf-8編碼的結(jié)果是一致的,因?yàn)檫@兩種編碼都使用一個(gè)byte表示一個(gè)英文字符
'abc'.encode('ascii').decode('utf-8') 'abc'
可以用一個(gè)編碼然后再另一個(gè)解碼,是可以成功還原的。但一般是不會(huì)這么做的。
ord函數(shù)獲取字符的整數(shù)表示和chr數(shù)把編碼轉(zhuǎn)換為對(duì)應(yīng)的字符
?ord('A') 65 ord('中') 20013 chr(66) 'B' chr(25991) '文'
對(duì)str和對(duì)bytes用len,意義是不同的。
len(str)統(tǒng)計(jì)字符數(shù),len(bytes)統(tǒng)計(jì)bytes數(shù)
>>> len('中文') 2 ?len(str)統(tǒng)計(jì)字符數(shù) >>> bt1 = '中文'.encode('gb2312') >>> bt2 = '中文'.encode('utf-8') >>> bt1 b'\xd6\xd0\xce\xc4' >>> bt2 b'\xe4\xb8\xad\xe6\x96\x87' >>> len(bt1) 4 >>> len(bt2) 6
以Unicode表示的str通過encode()方法可以編碼為指定的bytes
python解析 \x 和 \u "亂碼"
參數(shù)錯(cuò)誤
\xe5\x8f\x82\xe6\x95\xb0\xe6\x9c\x89\xe8\xaf\xaf ?
今日已經(jīng)完成過此任務(wù),請(qǐng)明日再做此任務(wù)吧!
\u4eca\u65e5\u5df2\u7ecf\u5b8c\u6210\u8fc7\u6b64\u4efb\u52a1\uff0c\u8bf7\u660e\u65e5\u518d\u505a\u6b64\u4efb\u52a1\u5427!
python2.7解析方法
>>> print(u'\xe5\x8f\x82\xe6\x95\xb0\xe6\x9c\x89\xe8\xaf\xaf ?'.encode('unicode_escape').decode('string_escape'))? >>>print('\u4eca\u65e5\u5df2\u7ecf\u5b8c\u6210\u8fc7\u6b64\u4efb\u52a1\uff0c\u8bf7\u660e\u65e5\u518d\u505a\u6b64\u4efb\u52a1\u5427!'.decode('unicode_escape'))
python3解析方法
>>>('\xe5\x8f\x82\xe6\x95\xb0\xe6\x9c\x89\xe8\xaf\xaf ?'.encode('raw_unicode_escape')).decode() >>>'\u4eca\u65e5\u5df2\u7ecf\u5b8c\u6210\u8fc7\u6b64\u4efb\u52a1\uff0c\u8bf7\u660e\u65e5\u518d\u505a\u6b64\u4efb\u52a1\u5427!'
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python中的yeild關(guān)鍵字提高代碼執(zhí)行效率場(chǎng)景實(shí)例探究
在Python編程語言中,yeild是一個(gè)非常實(shí)用的關(guān)鍵字,它不僅可以幫助你編寫更加簡(jiǎn)潔的代碼,還可以提高代碼的執(zhí)行效率,本文將詳細(xì)介紹yeild在Python中的使用方法,并通過示例代碼進(jìn)行演示,讓我們一起來探索這個(gè)強(qiáng)大的關(guān)鍵字吧2024-01-01python虛擬環(huán)境virtualenv的安裝與使用
virtualenv用于創(chuàng)建獨(dú)立的Python環(huán)境,多個(gè)Python相互獨(dú)立,互不影響,它能夠:1. 在沒有權(quán)限的情況下安裝新套件 2. 不同應(yīng)用可以使用不同的套件版本 3. 套件升級(jí)不影響其他應(yīng)用2017-09-09Python Pymysql實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)的示例
本文主要介紹了Python Pymysql實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)的示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03關(guān)于spring的@Bean注解放入引用Bean中初始化失敗分析
這篇文章主要介紹了關(guān)于spring的@Bean注解放入引用Bean中初始化失敗分析,Spring的@Bean注解用于告訴方法,產(chǎn)生一個(gè)Bean對(duì)象,然后這個(gè)Bean對(duì)象交給Spring管理,產(chǎn)生這個(gè)Bean對(duì)象的方法Spring只會(huì)調(diào)用一次,需要的朋友可以參考下2023-07-07