Python3中的bytes類型和str類型_第1頁
Python3中的bytes類型和str類型_第2頁
Python3中的bytes類型和str類型_第3頁
Python3中的bytes類型和str類型_第4頁
Python3中的bytes類型和str類型_第5頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第Python3中的bytes類型和str類型目錄前言:編碼發(fā)展的歷史bytes和str之間的異同

前言:

Python3最重要的新特性之一是對字符串和二進制數(shù)據(jù)流做了明確的區(qū)分。文本總是Unicode,由str類型表示,二進制數(shù)據(jù)則由bytes類型表示。Python3不會以任意隱式的方式混用str和bytes,你不能拼接字符串和字節(jié)流,也無法在字節(jié)流里搜索字符串(反之亦然),也不能將字符串傳入?yún)?shù)為字節(jié)流的函數(shù)(反之亦然)。

下面讓我們深入分析一下二者的區(qū)別和聯(lián)系。

編碼發(fā)展的歷史

在談bytes和str之前,需要先說說關(guān)于編碼是如何發(fā)展的。。

在計算機歷史的早期,美國為代表的英語系國家主導(dǎo)了整個計算機行業(yè),26個英文字母組成了多樣的英語單詞、語句、文章。因此,最早的字符編碼規(guī)范是ASCII碼,一種8位即1個字節(jié)的編碼規(guī)范,它可以涵蓋整個英語系的編碼需要。

編碼是什么?編碼就是把一個字符用一個二進制來表示。我們都知道,所有的東西,不管是英文、中文還是符號等等,最終存儲在磁盤上都是01010101這類東西。在計算機內(nèi)部,讀取和存儲數(shù)據(jù)歸根結(jié)底,處理的都是0和1組成的比特流。問題來了,人類看不懂這些比特流,如何讓這些010101對人類變得可讀呢?于是出現(xiàn)了字符編碼,它是個翻譯機,在計算機內(nèi)部某個地方,透明的幫我們將比特流翻譯成人類可以直接理解的文字。對于一般用戶,不需要知道這個過程是什么原理,是怎么執(zhí)行的。但是對于程序員卻是個必須搞清楚的問題。

以ASCII編碼為例,它規(guī)定1個字節(jié)8個比特位代表1個字符的編碼,也就是00000000這么寬,一個一個字節(jié)的解讀。例如:01000001表示大寫字母A,有時我們會偷懶的用65這個十進制來表示A在ASCII中的編碼。8個比特位,可以沒有重復(fù)的最多表示2的8次方(255)個字符。

后來,計算機得到普及,中文、日文、韓文等等國家的文字需要在計算機內(nèi)表示,ASCII的255位遠遠不夠,于是標準組織制定出了叫做UNICODE的萬國碼,它規(guī)定任何一個字符(不管哪國的)至少以2個字節(jié)表示,可以更多。其中,英文字母就是用2個字節(jié),而漢字是3個字節(jié)。這個編碼雖然很好,滿足了所有人的要求,但是它不兼容ASCII,同時還占用較多的空間和內(nèi)存。因為,在計算機世界更多的字符是英文字母,明明可以1個字節(jié)就能夠表示,非要用2個。

于是UTF-8編碼應(yīng)運而生,它規(guī)定英文字母系列用1個字節(jié)表示,漢字用3個字節(jié)表示等等。因此,它兼容ASCII,可以解碼早期的文檔。UTF-8很快就得到了廣泛的應(yīng)用。

在編碼的發(fā)展歷程中,我國還創(chuàng)造了自己的編碼方式,例如GBK,GB2312,BIG5。他們只局限于在國內(nèi)使用,不被國外認可。在GBK編碼中,中文漢字占2個字節(jié)。

bytes和str之間的異同

回到bytes和str的身上。bytes是一種比特流,它的存在形式是01010001110這種。我們無論是在寫代碼,還是閱讀文章的過程中,肯定不會有人直接閱讀這種比特流,它必須有一個編碼方式,使得它變成有意義的比特流,而不是一堆晦澀難懂的01組合。因為編碼方式的不同,對這個比特流的解讀也會不同,對實際使用造成了很大的困擾。

下面讓我們看看Python是如何處理這一系列編碼問題的:

s="中文"

type(s)

class'str'

b=bytes(s,encoding='utf-8')

b'\xe4\xb8\xad\xe6\x96\x87'

type(b)

class'bytes'

從例子可以看出,s是個字符串類型。Python有個內(nèi)置函數(shù)bytes()可以將字符串str類型轉(zhuǎn)換成bytes類型,b實際上是一串01的組合,但為了在ide環(huán)境中讓我們相對直觀的觀察,它被表現(xiàn)成了b\xe4\xb8\xad\xe6\x96\x87這種形式,開頭的b表示這是一個bytes類型。

\xe4是十六進制的表示方式,它占用1個字節(jié)的長度,因此中文被編碼成utf-8后,我們可以數(shù)得出一共用了6個字節(jié),每個漢字占用3個,這印證了上面的論述。在使用內(nèi)置函數(shù)bytes()的時候,必須明確encoding的參數(shù),不可省略。

我們都知道,字符串類str里有一個encode()方法,它是從字符串向比特流的編碼過程。而bytes類型恰好有個decode()方法,它是從比特流向字符串解碼的過程。除此之外,我們查看Python源碼會發(fā)現(xiàn)bytes和str擁有幾乎一模一樣的方法列表,最大的區(qū)別就是encode和decode。

從實質(zhì)上來說,字符串在磁盤上的保存形式也是01的組合,也需要編碼解碼。

如果,上面的闡述還不能讓你搞清楚兩者的區(qū)別,那么記住下面兩幾句話:

在將字符串存入磁盤和從磁盤讀取字符串的過程中,Python自動地幫你完成了編碼和解碼的工作,你不需要關(guān)心它的過程。使用bytes類型,實質(zhì)上是告訴Python,不需要它幫你自動地完成編碼和解碼的工作,而是用戶自己手動進行,并指定編碼格式。Python已經(jīng)嚴格區(qū)分了bytes和str兩種數(shù)據(jù)類型,你不能在需要bytes類型參數(shù)的時候使用str參數(shù),反之亦然。這點在讀寫磁盤文件時容易碰到。

在bytes和str的互相轉(zhuǎn)換過程中,實際就是編碼解碼的過程,必須顯式地指定編碼格式。

b

b'\xe4\xb8\xad\xe6\x96\x87'

type(b)

class'bytes'

s1=str(b)

"b'\\xe4\\xb8\\xad\\xe6\\x96\\x87'"

type(s1)

class'str'

s1=str(b,encoding='utf-8')

type(s1)

cla

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論