在Python 3版本中,把'xxx'和u'xxx'統一成Unicode編碼,即寫不寫前綴u都是一樣的,
在Python 3版本中,所有的字串都是使用Unicode編碼的字串序列,
Python 3最重要的新特性之一是對字串和二進制資料流做了明確的區分,文本總是 Unicode,由 str 型別表示,二進制資料則由 bytes 型別表示,Python 3 不會以任意隱式的方式混用 str 和 bytes ,你不能拼接字串和位元組流,也無法在位元組流里搜索字串(反之亦然),也不能將字串傳入引數為位元組流的函式(反之亦然),
# -*- coding: utf-8 -*-
import sys
# 查看默認編碼
print(sys.getdefaultencoding()) # utf-8
b = b'\xe4\xb8\xad\xe5\x9b\xbd' # py3定義bytes使用 b = b'dfja'
print(b, type(b)) # b'\xe4\xb8\xad\xe5\x9b\xbd' <class 'bytes'>
b_decode = b.decode('utf-8')
print(b_decode, type(b_decode)) # 中國 <class 'str'>
s = '中國' # Python3中定義的字串(str)默認就是 unicode字串
print(s, type(s)) # 中國 <class 'str'>
# s1 = s.decode("utf-8") # AttributeError: 'str' object has no attribute 'decode' ← Python3中字串不再有decode方法
s2 = s.encode("gbk") # 將字串(str)用 “gbk字符編碼” 編碼為 “gbk字符編碼的位元組”
print(s2, type(s2)) # b'\xd6\xd0\xb9\xfa' <class 'bytes'>
s22 = s2.decode('gbk') # 將 “位元組串” 用 “gbk字符編碼” 解碼 為 “字串(str)”
print(s22, type(s22)) # 中國 <class 'str'>
s3 = s.encode("utf-8")
print(s3, type(s3)) # b'\xe4\xb8\xad\xe5\x9b\xbd' <class 'bytes'>
s33 = s.encode("utf-8").decode('utf-8')
print(s33, type(s33)) # 中國 <class 'str'>
bytes和str之間的異同
回到bytes和str的身上,bytes是一種位元流,它的存在形式是01010001110這種,我們無論是在寫代碼,還是閱讀文章的程序中,肯定不會有人直接閱讀這種位元流,它必須有一個編碼方式,使得它變成有意義的位元流,而不是一堆晦澀難懂的01組合,因為編碼方式的不同,對這個位元流的解讀也會不同,對實際使用造成了很大的困擾,下面讓我們看看Python是如何處理這一系列編碼問題的:
>>> s = "中文"
>>> s
'中文'
>>> type(s)
<class 'str'>
>>> b = bytes(s, encoding='utf-8')
>>> b
b'\xe4\xb8\xad\xe6\x96\x87'
>>> type(b)
<class 'bytes'>
從例子可以看出,s是個字串型別,Python有個內置函式bytes()可以將字串str型別轉換成bytes型別,b實際上是一串01的組合,但為了在ide環境中讓我們相對直觀的觀察,它被表現成了b'\xe4\xb8\xad\xe6\x96\x87'這種形式,開頭的b表示這是一個bytes型別,\xe4是十六進制的表示方式,它占用1個位元組的長度,因此”中文“被編碼成utf-8后,我們可以數得出一共用了6個位元組,每個漢字占用3個,這印證了上面的論述,在使用內置函式bytes()的時候,必須明確encoding的引數,不可省略,
我們都知道,字串類str里有一個encode()方法,它是從字串向位元流的編碼程序,而bytes型別恰好有個decode()方法,它是從位元流向字串解碼的程序,除此之外,我們查看Python原始碼會發現bytes和str擁有幾乎一模一樣的方法串列,最大的區別就是encode和decode,
從實質上來說,字串在磁盤上的保存形式也是01的組合,也需要編碼解碼,
如果,上面的闡述還不能讓你搞清楚兩者的區別,那么記住下面兩幾句話:
在將字串存入磁盤和從磁盤讀取字串的程序中,Python自動地幫你完成了編碼和解碼的作業,你不需要關心它的程序,
使用bytes型別,實質上是告訴Python,不需要它幫你自動地完成編碼和解碼的作業,而是用戶自己手動進行,并指定編碼格式,
Python已經嚴格區分了bytes和str兩種資料型別,你不能在需要bytes型別引數的時候使用str引數,反之亦然,這點在讀寫磁盤檔案時容易碰到,
在bytes和str的互相轉換程序中,實際就是編碼解碼的程序,必須顯式地指定編碼格式,.
>>> b
b'\xe4\xb8\xad\xe6\x96\x87'
>>> type(b)
<class 'bytes'>
>>> s1 = str(b)
>>> s1
"b'\\xe4\\xb8\\xad\\xe6\\x96\\x87'"
>>> type(s1)
<class 'str'>
>>> s1 = str(b, encoding='utf-8')
>>> s1
'中文'
>>> type(s1)
<class 'str'>
我們再把字串s1,轉換成gbk編碼的bytes型別:
>>> s1
'中文'
>>> type(s1)
<class 'str'>
>>> b = bytes(s1, encoding='gbk')
>>> b
b'\xd6\xd0\xce\xc4'
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/84139.html
標籤:Python
上一篇:python 的魔法方法
