1.懷念python3
python3默認(rèn)情況下遇伞,是通過unicode直接編碼操作的掂名,對于字符串据沈、特殊字符、數(shù)字的支持都是一致的饺蔑,字符串的編碼和解碼操作方式非常簡潔锌介。
#字符串構(gòu)造了一個str對象,默認(rèn)情況下就是通過unicode直接編碼的字符
>>> s = "中文"
#如果將字符轉(zhuǎn)換成字節(jié),進行編碼操作:s.encode(“utf-8”)
>>> x = s.encode("utf-8")
>>> x
b'\xe4\xb8\xad\xe6\x96\x87'
如果將字節(jié)轉(zhuǎn)換成字符孔祸,進行編碼操作:s.decode(“utf-8”)
>>> x
b'\xe4\xb8\xad\xe6\x96\x87'
>>> x.decode("utf-8")
'中文'
2. 吐槽python2
python2中隆敢,默認(rèn)情況下是通過ascii編碼進行操作的。
python2中的字符串有這樣幾種類型 [basestring | str | unicode]
其中 str 和 unicode 是繼承自 basestring 的崔慧。
糟心的來了:python2中創(chuàng)建的字符串s=”abc”是str類型的拂蝎,但在python2中是 str 是 bytes字節(jié)類型保存的.......有毒。
默認(rèn)情況下:
>>> s = "中文"
>>> s
'\xd6\xd0\xce\xc4'
所以在包含中文字符串保存時惶室,需要在字符串的前添加一個u字符
#表示是通過unicode編碼的
>>> s = u'中文'
>>> s
u'\u4e2d\u6587'
如果是默認(rèn)字節(jié)形式的中文字符串温自,要得到原本的中文形式
#需要decode()函數(shù)操作
>>> s = "中文"
>>> s
'\xd6\xd0\xce\xc4'
>>> x = s.decode("gbk")
>>> x
u'\u4e2d\u6587'
-
為什么python2中要將 unicode 編碼的字符串轉(zhuǎn)換成 ascii 編碼進行后續(xù)的操作?
因為python內(nèi)置的大量模塊拇涤,并沒有提供中文支持捣作,調(diào)用內(nèi)置模塊的函數(shù)操作時,如果出現(xiàn)了非 ascii 編碼鹅士,就會出現(xiàn) ascii編碼不支持的錯誤
UnicodeEncodeError: 'ascii' codec can't encode characters將unicode字符串券躁,轉(zhuǎn)換成bytes類型的str字符串 >>> s u'\u4e2d\u6587' >>> xs.encode("gbk") >>> x = s.encode("gbk") >>> x '\xd6\xd0\xce\xc4'
-
python2編碼解碼的問題——字符串
- 核心:字節(jié)和字符之間的轉(zhuǎn)換
- 字節(jié):專門給程序使用【python2內(nèi)建的模塊,如~寫入文件】
- 字符:給用戶看
- 默認(rèn)創(chuàng)建的字符串str類型的掉盅,bytes字節(jié)類型
- 字節(jié)類型 str ->字符類型 unicode:s.decode(“utf-8”)
- 字符類型 unicode ->字節(jié)類型 str: s.encode(“utf-8”)
# 默認(rèn)encode(“ascii”)
警告:python2中的str類型也拜,默認(rèn)就有一個encode()函數(shù),但是這個函數(shù)只是在定義時為了對象操作的完整性出現(xiàn)的趾痘,使用會直接報錯慢哈。
python2中的unicode類型,默認(rèn)有一個decode()函數(shù)永票,同樣不要去使用卵贱!