一、認識字符編碼
在計算機中,所有的數據都是存儲在二進制的形式下的,字符也不例外,因此需要將字符轉化成二進制,計算機才能夠處理,這個轉化的過程就是編碼。編碼就是一套規則,將字符集映射為一系列二進制數字。常用的字符集編碼有ASCII碼、Unicode和UTF-8等。
ASCII碼是由美國人制定的一套字符集編碼標準,最初只包含128個字符(大小寫字母、數字和部分符號),後來擴展到了256個字符,用於英文和西歐語言。ASCII碼的缺點是不能表示中文、日文、韓文等日常常用的字符。
因此,隨着國際語言的普及,Unicode應運而生。Unicode是全球通用的一種字符集編碼,它包含了世界上所有的字符集,不僅包含了拉丁文的字符集,還包括中文、日文、阿拉伯文等自然語言的字符集。Unicode的碼位支持17個平面,每個平面最多可以容納65536個碼位,總共可以支持1,114,112個碼位,一一對應地對應了世界上所有的字符。(註:Unicode存在與存儲器中的方式有所不同,可以是UTF-8,也可以是UTF-16,UF-32等)。
UTF-8是一種針對Unicode的可變長度字符編碼,它可以用來表示Unicode標準中的任何字符,且其編碼後的字節可以用ASCII碼錶示。UTF-8採用變長編碼,將一個碼位轉化成1~4個字節,根據字符所處的Unicode碼位選擇適當長度的存儲。
二、Python字符串編碼
Python字符串在內部都是以Unicode存儲的,因此可以處理不同國家的字符,但是將Unicode編碼保存在硬盤上的時候,需要將其轉換成字節序列,這時候就遇到了字符集編碼的問題。如果編碼方式不同,那麼就可能會出現亂碼現象。 對於Python,我們一般將字符串表示為unicode,而將文件存儲到磁盤中時需要使用一種編碼方式(如UTF-8)將字符串編碼成utf-8格式的字節序列,這樣在讀取該文件之後才能夠正確地將字節序列解碼成unicode格式的字符串。
s = 'Python編碼測試' print(s) print(s.encode('utf-8'))
執行上述代碼,輸出如下:
'Python編碼測試' b'Python\xe7\xbc\x96\xe7\xa0\x81\xe6\xb5\x8b\xe8\xaf\x95'
在編碼時,可以使用Python內置的字符串方法encode()方法將Unicode字符串轉換成字節數據存儲到硬盤中。
三、解決亂碼問題
亂碼就是因為編碼方式不正確,也就是在對數據進行獲得或者將數據進行傳輸或者存儲的過程種,編碼發生了錯誤,使得數據的內容被錯誤地轉換,最終出現亂碼。
當從文件中讀取數據時,需要將字節轉換成字符串,這時候就需要使用字符串的decode()方法。通常情況下,我們可以傳遞一個編碼參數,表示對字節進行解碼時所採用的字符集編碼方式,如果不知道字符編碼方式,可以通過chardet庫進行檢測。
在使用Python進行數據爬取時,會經常遇到網頁中存在中文,但是爬取下來的內容是亂碼的情況。此時,可以使用requests庫中的response.encoding屬性和response.content屬性進行解碼。其中,response.encoding屬性表示當前HTTP的編碼方式,而response.content屬性則可以直接返回字節型的數據。
import requests import chardet url = 'https://www.baidu.com/' response = requests.get(url) content = response.content print(chardet.detect(content)) print(content.decode('utf-8'))
執行上述代碼,輸出如下:
{'encoding': 'utf-8', 'confidence': 0.99, 'language': ''} <!DOCTYPE html> <!--STATUS OK--> <!-- ...
四、讀取寫入文件
在Python中,讀取和寫入文件時,需要指定文件所採用的字符編碼方式。當讀取時,如果沒有指定編碼方式,那麼Python默認採用ASCII編碼方式;當寫入文件時,默認採用UTF-8編碼方式。
# 寫入文件 s = 'Python編碼測試' with open('test.txt', 'w', encoding='utf-8') as f: f.write(s) # 讀取文件 with open('test.txt', 'r', encoding='utf-8') as f: content = f.read() print(content)
五、總結
掌握Python中字符編碼的知識非常重要,它關係到數據在不同平台之間傳輸、存儲和顯示的正確性,也涉及到Python程序處理中文數據和編寫Web應用程序的能力。希望本文對大家的學習有所幫助。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/252210.html