中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
Python encode和decode
Python encode和decode
今天在寫一個(gè)StringIO.write(int)示例時(shí)思維那么一發(fā)散就拐到了字符集的問題上,順手搜索一發(fā),除了極少數(shù)以外,絕大多數(shù)中文博客都解釋的慘不忍睹,再鑒于被此問題在oracle的字符集體系中蹂躪過,因此在過往筆記的基礎(chǔ)上增刪了幾個(gè)示例貼出來。
Python2:
首先清楚兩個(gè)Python 2中的概念:str和unicode 這是python2中的兩種用于表示文本的類型,一般來說你直接打出的字符都屬于前者,加了u前綴的字符則屬于后者。
str is text representation in bytes, unicode is text representation in characters.
此觀點(diǎn)來自stackoverflow,是得票最多的一個(gè)回答,也是我認(rèn)為最好的一個(gè),但是從我個(gè)人的角度來看這個(gè)表述依然不足,最適合的表述應(yīng)當(dāng)是:
str is text representation in bytes, unicode is text representation in unicode characters(or unicode bytes).
貌似沒多大區(qū)別......可能會(huì)被人打,但我的意思是python2里的unicode是字符和編碼綁定的,只要是unicode類型那么他的編碼和字符都已經(jīng)固定了,但是str類型卻只有編碼,只有最初打出它的人才知道他的字符是什么(或者說才能通過適當(dāng)?shù)淖址獯a為人眼可懂的字符)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Python2里的str是十六進(jìn)制表示的二進(jìn)制編碼,unicode是一個(gè)字符:
通俗點(diǎn)來說就是Python2里的str類型是一堆二進(jìn)制編碼,如果不知道是什么字符集那么你除了一堆十六進(jìn)制
數(shù)什么都看不出來(當(dāng)然平時(shí)你使用的工具都是能看到的,因?yàn)楣ぞ咭呀?jīng)做了轉(zhuǎn)碼),通過decode可以將其按固定的字符集解碼,生成unicode字符。
例如下例(python2環(huán)境下的windows cmd窗口):
>>> a='你好'
>>> a.decode('utf-8')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python27\lib\encodings\utf_8.py", line 16, in decode
return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xc4 in position 0: invalid continuation byte
錯(cuò)誤的原因是這里的“你好”字符是cp936編碼(相當(dāng)于gbk),utf-8屬于非ANSI體系的編碼,“你好”的gbk二進(jìn)制碼不符合unicode體系的編碼規(guī)則因此報(bào)錯(cuò)。
>>> print a.decode('gbk'),type(a.decode('gbk'))
你好 <type 'unicode'>
這樣就可以啦,既然a是gbk編碼的str那么按gbk進(jìn)行decode解碼,自然能得到unicode的你好字符。
1
2
3
4
5
decode: str to unicode,decode的輸入必須是str類型,輸出一定是unicode類型
str.decode(encoding='UTF-8',errors='strict')
encode: unicode to str,encode的輸入必須是unicode類型,輸出一定是str類型
unicode_char.encode(encoding='gbk',errors='strict')
Python3:
在Python3中str調(diào)用decode()方法會(huì)遇到: AttributeError: 'str' object has no attribute 'decode' .
why?
這是因?yàn)閜ython3中表示文本的只有一種類型了,那就是str,你以為這是python2里的那個(gè)str嗎?No! 這個(gè)str是python2中的unicode類型......
那么原來的str哪里去了?被命名為bytes類型了,decode方法也隨之給了bytes類型,encode給了str類型。
這樣做的好處是:
在Python2中str和unicode都有decode,encode兩種方法,但是字符集參數(shù)不設(shè)置正確的話,函數(shù)經(jīng)常報(bào)錯(cuò),文本能否正確流通取決于大家是否清楚輸入編碼的字符集,這對(duì)于全球化的網(wǎng)站來說是個(gè)巨坑,而在Python3中無論你輸入什么字符,統(tǒng)一都是str類型的(也就是python2里的unicode類型),通過bytes和str類型的分離將decode,encode這兩種方法分離,encode函數(shù)不會(huì)出錯(cuò),因?yàn)榫幋a與字符集是綁定的,你可以隨意將unicode字符轉(zhuǎn)化為任意ANSI體系字符集的bytes類型,此時(shí)在已知ANSI字符集的情況下,你對(duì)bytes類型的decode轉(zhuǎn)碼一定不會(huì)出錯(cuò)。通過這種方式就避免了python2中輸入str類型帶來的編碼混亂問題。
1
2
3
4
5
6
7
8
9
10
11
12
[root@python ~]# python3
Python 3.6.5 (default, Apr  9 2018, 17:15:34)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> a='你好'
>>> type(a)
<class 'str'>
>>> a.encode('gbk')
b'\xc4\xe3\xba\xc3'
>>> type(a.encode('gbk'))
<class 'bytes'>
通過encode方式我們可以把unicode字符轉(zhuǎn)為任意字符集的bytes類型,這種bytes類型可以通過decode()來重新轉(zhuǎn)為unicode。
使用相似的觀點(diǎn)來表述Python3中的bytes和str的區(qū)別就是:
bytes is text representation in bytes only if you know the charset, str is text representation in unicode characters(or unicode bytes).
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
python3大作戰(zhàn)之encode與decode講解
Python 3 字符串中的 STR和Bytes 究竟有什么區(qū)別?
專業(yè)在線電子書網(wǎng)站
bytes類型--python
python-字符編碼轉(zhuǎn)換
Python對(duì) decode / encode的補(bǔ)充說明
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服