1. 程式人生 > >中途回顧,bytes數據類型是什麽,和字符串什麽關系

中途回顧,bytes數據類型是什麽,和字符串什麽關系

就會 unicode sci cnblogs 是什麽 字節 範圍 不可變 com

參考:https://segmentfault.com/a/1190000004450876

Bytes 對象是由單個字節作為基本元素(8位,取值範圍 0-255)組成的序列,為不可變對象。

Bytes 對象只負責以二進制字節序列的形式記錄所需記錄的對象,至於該對象到底表示什麽(比如到底是什麽字符)則由相應的編碼格式解碼所決定。我們可以通過調用 bytes() 類(沒錯,它是類,不是函數)生成 bytes 實例,其值形式為 b‘xxxxx‘,其中 ‘xxxxx‘ 為一至多個轉義的十六進制字符串(單個 x 的形式為:\xHH,其中 \x 為小寫的十六進制轉義字符,HH 為二位十六進制數)組成的序列,每個十六進制數代表一個字節(八位二進制數,取值範圍 0-255),對於同一個字符串如果采用不同的編碼方式生成 bytes 對象,就會形成不同的值:

技術分享

比如上例中的 a 字符串對象,其十進制 unicode 值為 24464,分別使用 ‘utf-8‘ 和 ‘gb2312‘ 兩種編碼格式將其轉換成 bytes 對象 b 和 c ,結果 b 和 c 的值是完全不同的,由於基於的編碼格式不一致, b c 長度甚至都不相同,前者有 3 個字節長度,後者有 2 個字節長度:

技術分享

另外,對於 ASCII 字符串,可以直接使用 b‘xxxx‘ 賦值創建 bytes 實例,但對於非 ASCII 編碼的字符則不能通過這種方式創建 bytes 實例:

技術分享

由於 bytes 是序列,因此我們可以通過索引或切片訪問它的元素:

技術分享

可以發現如果以單個索引的形式訪問元素,其會直接返回單個字節的十進制整數,而以序列片段的形式訪問時,則返回相應的十六進制字符序列。

對於 bytes 實例,如果需要還原成相應的字符串,則需要借助內置的解碼函數 decode(),借助相應的編碼格式解碼為正常字符串對象,如果采用錯誤的編碼格式解碼,則有可能發生錯誤:

技術分享

中途回顧,bytes數據類型是什麽,和字符串什麽關系