91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python字符串的構成及字符編碼的細節是什么

發布時間:2022-01-18 14:40:53 來源:億速云 閱讀:153 作者:iii 欄目:編程語言

本篇內容主要講解“python字符串的構成及字符編碼的細節是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“python字符串的構成及字符編碼的細節是什么”吧!

字節與字符

計算機存儲的一切數據,文本字符、圖片、視頻、音頻、軟件都是由一串01的字節序列構成的,一個字節等于8個比特位。

而字符就是一個符號,比如一個漢字、一個英文字母、一個數字、一個標點都可以稱為一個字符。

字節方便存儲和網絡傳輸,而字符用于顯示,方便閱讀。例如字符 "p" 存儲到硬盤是一串二進制數據 01110000,占用一個字節的長度

編碼與解碼

我們用編輯器打開的文本,看到的一個個字符,最終保存在磁盤的時候都是以二進制字節序列形式存起來的。那么從字符到字節的轉換過程就叫做編碼(encode),反過來叫做解碼(decode),兩者是一個可逆的過程。編碼是為了存儲傳輸,解碼是為了方便顯示閱讀。

例如字符 "p" 經過編碼處理保存到硬盤是一串二進制字節序列 01110000 ,占用一個字節的長度。字符 "禪" 有可能是以 "11100111 10100110 10000101" 占用3個字節的長度存儲,為什么說是有可能呢?這個放到后面再說。

Python 的編碼為什么那么蛋疼?當然,這不能怪開發者。

這是因為 Python2 使用 ASCII 字符編碼作為默認編碼方式,而 ASCII 不能處理中文,那么為什么不用 UTf-8 呢?因為 Guido 老爹為 Python 編寫第一行代碼是在1989年的冬天,1991年2月正式開源發布了第一個版本,而 Unicode 是1991年10月發布的,也就是說 Python 這門語言創立的時候 UTF-8 還沒誕生,這是其一。

Python 把字符串的類型還搞成兩種,unicode 和 str ,以至于把開發者都弄糊涂了,這是其二。python3 徹底把 字符串重新改造了,只保留一種類型,這是后話,以后再說。

str與unicode

Python2 把字符串分為 unicode 和 str 兩種類型。本質上 str 是一串二進制字節序列,下面的示例代碼可以看出 str 類型的 "禪" 打印出來是十六進制的 \xec\xf8 ,對應的二進制字節序列就是 '11101100 11111000'。

而 unicode 類型的 u"禪" 對應的 unicode 符號是 u'\u7985'

我們要把 unicode 符號保存到文件或者傳輸到網絡就需要經過編碼處理轉換成 str 類型,于是 python 提供了 encode 方法,從 unicode 轉換到 str,反之亦然。

不少初學者怎么也記不住 str 與 unicode 之間的轉換用 encode 還是 decode,如果你記住了 str 本質上其實是一串二進制數據,而 unicode 是字符(符號),編碼(encode)就是把字符(符號)轉換為 二進制數據的過程,因此 unicode 到 str 的轉換要用 encode 方法,反過來就是用 decode 方法。

encoding always takes a Unicode string and returns a bytes sequence, and decoding always takes a bytes sequence and returns a Unicode string".

清楚了 str 與 unicode 之間的轉換關系之后,我們來看看什么時候會出現 UnicodeEncodeError、UnicodeDecodeError 錯誤。

錯誤日志

UnicodeEncodeError: 'ascii' codec can't encode characters in position 6-7: ordinal not in range(128)

為什么會出現 UnicodeEncodeError?

因為調用 write 方法時,Python 會先判斷字符串是什么類型,如果是 str,就直接寫入文件,不需要編碼,因為 str 類型的字符串本身就是一串二進制的字節序列了。

如果字符串是 unicode 類型,那么它會先調用 encode 方法把 unicode 字符串轉換成二進制形式的 str 類型,才保存到文件,而 encode 方法會使用 python 默認的 ascii 碼來編碼

但是,我們知道 ASCII 字符集中只包含了128個拉丁字母,不包括中文字符,因此 出現了 'ascii' codec can't encode characters 的錯誤。要正確地使用 encode ,就必須指定一個包含了中文字符的字符集,比如:UTF-8、GBK。所以要把 unicode 字符串正確地寫入文件,就應該預先把字符串進行 UTF-8 或 GBK 編碼轉換。當然,把 unicode 字符串正確地寫入文件不止一種方式,但原理是一樣的,這里不再介紹,把字符串寫入數據庫,傳輸到網絡都是同樣的原理

UnicodeDecodeError

把一個經過 UTF-8 編碼后生成的字節序列 '\xe7\xa6\x85' 再用 GBK 解碼轉換成 unicode 字符串時,出現 UnicodeDecodeError,因為 (對于中文字符)GBK 編碼只占用兩個字節,而 UTF-8 占用3個字節,用 GBK 轉換時,還多出一個字節,因此它沒法解析。避免 UnicodeDecodeError 的關鍵是保持 編碼和解碼時用的編碼類型一致。

這也回答了文章開頭說的字符 "禪",保存到文件中有可能占3個字節,有可能占2個字節,具體處決于 encode 的時候指定的編碼格式是什么。

str 與 unicode 字符串 執行 + 操作是,Python 會把 str 類型的字節序列隱式地轉換成(解碼)成 和 x 一樣的 unicode 類型,但Python是使用默認的 ascii 編碼來轉換的,而 ASCII 中不包含中文,所以報錯了。正確地方式應該是顯示地把 y 用 UTF-8 或者 GBK 進行解碼。

到此,相信大家對“python字符串的構成及字符編碼的細節是什么”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

通州区| 湘潭市| 从化市| 黔西县| 和龙市| 永顺县| 海丰县| 陇川县| 田林县| 英吉沙县| 密云县| 类乌齐县| 华容县| 武定县| 霞浦县| 鄂伦春自治旗| 玉田县| 玉山县| 棋牌| 宁阳县| 扶沟县| 景洪市| 彭水| 山西省| 青田县| 来安县| 天长市| 姜堰市| 泗水县| 西丰县| 彰化县| 哈巴河县| 陆良县| 竹山县| 泽州县| 藁城市| 黄陵县| 泸溪县| 辽阳县| 惠水县| 玉环县|