您好,登錄后才能下訂單哦!
這篇文章主要介紹“Python字符集和字符編碼是什么”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Python字符集和字符編碼是什么”文章能幫助大家解決問題。
首先計算機存儲的基本單位是字節,由8個比特位組成,由于英文字母算上大小寫只有52個,再加上若干字符,數量不會超過256個,因此一個字節完全可以表示。但是隨著計算機的普及,越來越多的非英文字符出現,導致一個字節已經無法表示了。所以只能曲線救國,對于一個字節無法表示的字符,使用多個字節表示
但是這樣會出現兩個問題:
因為每個國家都有自己的字符編碼,所以不支持多國語言,例如中文的編碼不可以包含日文,否則就會造成亂碼;
沒有統一標準,例如中文有GB2312、GBK、GB18030等多個標準;
到這里我們先不繼續往下深入,我們先來理清楚一些概念。
估計有很多小伙伴搞不清這兩者的區別,我們先來解釋一下所謂的字符集和字符編碼是怎么一回事?
字符集:系統支持的所有字符組成的集合,像ASCII、GB2312、Big5、unicode都屬于字符集。只不過不同的字符集所能容納的字符個數不同,比如ASCII字符集中不包含中文,unicode則可以容納世界上的所有字符;
字符編碼:負責將每個字符轉換成一個或多個計算機可以接受的具體數字,該數字可以理解為編號,因此字符編碼維護了字符和編號之間的對應關系。而編碼也分為多種,比如ascii、gbk、utf-8等等,字符編碼不同,那么字符轉換之后的編號也不同,當然能轉化的字符種類也不同。比如ASCII這種字符編碼,它就只能轉換ASCII字符。
當然,ASCII比較特殊,它既是字符集、也是字符編碼。并且不管采用什么編碼,ASCII字符對應的編號永遠是相同的。
將字符串中的每一個字符轉成對應的編號,那么得到的就是字節序列(bytes對象),因為計算機存儲和網絡通訊的基本單位都是字節,所以字符串必須以字節序列的形式進行存儲或傳輸。
因此字符串和字節序列在某種程度上是很相似的,字符串按照指定的編碼進行encode即可得到字節序列,也就是將每個字符都轉成對應的編號;字節序列按照相同的編碼decode即可得到字符串,也就是根據編號找到對應的字符。
比如我們寫了一段文本,然后在存儲的時候必須先進行編碼,也就是將每一個字符都轉成一個或多個系統可以接受的數字、即對應的編號之后,才可以進行存儲。
s = "你好" # 編碼之后就是一串數字 print(s.encode("gbk")) # b'\xc4\xe3\xba\xc3'
假設文本中只有你好二字,在存儲的時候采用gbk進行編碼,那么在讀取的時候也必須使用gbk進行解碼,否則的話就會無法解析而報錯。因為字符編碼不同,字符對應的編號也不同。
再比如每個國家都有自己的字符編碼,你在日本的一臺計算機上寫好的文件拿到中國的計算機上打開,很有可能出現亂碼。因為字符編碼不同,字符和編號之間的對應關系也不同,采用不同的字符編碼進行解析肯定會出問題。
但我們說,對于ASCII字符來說,由于不管采用哪一種編碼,它們得到的編號都是固定的。所以編碼對于ASCII字符來說,沒有任何影響。
s = "abc" print(s.encode("gbk")) # b'abc' print(s.encode("gbk").decode("utf-8")) # abc # 但如果是非ASCII字符,就不行了 try: s = "你好" s.encode("gbk").decode("utf-8") except UnicodeError as e: # 報錯了,無法解析 print(e) # 'utf-8' codec can't decode byte 0xc4 in position 0: invalid continuation byte
這里我們再回憶一下bytes對象,我們創建的時候可以采用字面量的方式,比如 b"abc",但是 b"憨"卻不可以。原因就是憨這個字符不是ASCII字符,那么采用不同的字符編碼,其對應的編號是不同的,而這種方式Python又不知道我們使用哪一種編碼,所以不允許這么做,而是需要通過"憨".encode的方式手動指定字符編碼。
但是對于 ASCII 字符而言,不管采用哪一種字符編碼,得到的編號都是一樣的, 所以Python針對ASCII字符則允許這種做法,比如b"abc"。并且我們看到,對于漢字來說,在編碼之后會對應多個編號,而每個編號占1字節,因此不同的字符所占的大小可能不同。
關于“Python字符集和字符編碼是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。