Python 3中的str和bytes類型

來源:互聯網
上載者:User

標籤:編碼格式   coding   嚴格   顯示   環境   文檔   就是   位元組   python3   

Python3 中的str和bytes類型

Python3最重要的新特性之一是:對字串和位元據流做了明確的區分。文本總是Unicode,由str類型表示,位元據則由bytes類型表示。Python3不會以任何隱式的方式混用str和bytes,我們不能拼接字串和位元組流,也無法在位元組流裡搜尋字串(反之亦然),也不能將字串傳入參數為位元組流(反之亦然)。

編碼發展的曆史

在bytes和str之前,需要先說說關於編碼的發展。在電腦曆史的早期,美國為代表的英語系國家主導了整個電腦行業,26個英文字母組成了多樣的英語單詞、語句、文章。因此,最早的字元編碼規範是ASCII碼,一種8位即一個位元組碼的編碼規範,它可以涵蓋整個英語系的編碼需要。

什麼是編碼?編碼就是把一個字元用一個二進位來表示。我們都知道,所有的東西,不管是英文、中文還是符號等等,最終儲存在磁碟上都是010101這類東西。在電腦內部,讀取和儲存資料歸根結底,處理的都是0和1組成的位元流。問題來了,人類看不懂這些位元流,如何讓這些010101對認類變得可讀呢?於是出現了字元編碼,他是個翻譯機,在電腦內部某個地方,透明的協助我們將位元流翻譯成認類可以直接理解的文字。對於一般使用者,不需要知道這個過程是什麼原理,是怎麼執行的,但是對於程式員卻是個必須搞清楚的問題。
以ASCII編碼為例,它規定1個位元組8位元位代表1個字元的編碼,也就是"00000000"這麼寬,一個一個位元組的解讀。例如:01000001表示大寫字母A,有時候我們會用65這個十進位來表示A在ASCII中的編碼。8個位元位,可以沒有重複的最多表示2的8次方(255)個字元。

後來電腦得到普及,中文、日文、韓文等等國家的文字需要在電腦內表示,ASCII的255個遠遠不夠。於是標準組織制定出了叫做Unicode的萬國碼,它規定任何一個字元(不管哪國的)至少以2個位元組表示,可以更多。其中,英文字母就是用2個位元組,而漢字是3個位元組。這個編碼雖然好,滿足了所有人的要求,但是它不相容ASCII,同時還佔用較多的記憶體空間。因為在電腦世界更多的字元是英文字母,明明可以用1個位元組就能夠表示,非要用2個。
於是UTF-8(針對Unicode的可變長度字元編碼)編碼應運而生,它規定英文字母系列用1個位元組表示,漢字用3個位元組表示等等。因此,它相容ASCII,可以節碼早期的文檔,很快UTF-8就得到了廣泛的應用。在編碼的發展曆程中,我國還創造了自己的編碼方式,例如:GBK、GB2312、BIG5,它們只局限在國內使用,不被國外認可。在GBK編碼中,中文漢字佔2個位元組。

bytes和str之間的異同

回到bytes和str之上,bytes是一種位元流,它的存在形式是01010011這種。我們無論是在寫代碼,還是在閱讀文章的過程中,肯定不會有人直接閱讀這種位元流,他必須有一種編碼方式,使得它變成有意義的位元流,而不是一堆晦澀難懂的01組合。因為編碼方式的不同,對這個位元流的解讀也會不同,對實際使用造成了很大的困擾。下面我們看看Python是如何處理這一系列編碼問題的:

>>> s = "中文">>> s‘中文‘>>> type(s)<class ‘str‘>>>> b = bytes(s, encoding="utf-8")>>> bb‘\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的組合,也需要編碼和解碼。如果,上面的闡述還不能讓你搞清楚兩者的區別,那麼請記住下面幾句話:

  • 1.在將字串存入磁碟和從磁碟中讀取的過程中,Python自動地協助我們完成了編碼和解碼的工作,我們不需要關心其過程;
  • 2.使用bytes類型,實際上是告訴Python,不需要它幫我們自動地完成編碼和解碼的工作,而是使用者自己手動進行,並指定編碼格式;
  • 3.Python已經嚴格區分了bytes和str兩種資料類型,我們不能在需要bytes型別參數的時候使用str參數,反之亦然,這點在讀寫磁碟檔案時容易碰到;

在bytes和str的互相轉換過程中,實際就是編碼和解碼的過程,必須顯示地指定編碼格式:

>>> bb‘\xe4\xb8\xad\xe6\x96\x87‘>>> type(b)<class ‘bytes‘>>>> res = str(b)>>> res"b‘\\xe4\\xb8\\xad\\xe6\\x96\\x87‘">>> type(res)<class ‘str‘>>>> result = str(b, encoding="utf-8")>>> result‘中文‘>>> type(result)<class ‘str‘>

我們再把res轉換成GBK編碼的bytes類型:

>>> gbk_b = bytes(result, encoding="gbk")>>> gbk_bb‘\xd6\xd0\xce\xc4‘>>> s = str(gbk_b, encoding="gbk")>>> s‘中文‘>>> type(s)<class ‘str‘>

Python 3中的str和bytes類型

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.