Python3基礎知識- 字符編碼

python解釋器在加載.py文件中的代碼時,會對內容進行編碼

python默認字符編碼

  • python 2.x默認的字符編碼是ASCII,默認的文件編碼也是ASCII。( 以utf-8 或者 gbk等編碼的代碼,加載到內存,並不會轉爲unicode,編碼仍然是utf-8或者gbk等編碼。)
  • python 3.x默認的字符編碼是unicode,默認的文件編碼是utf-8。( 以utf-8 或者 gbk等編碼的代碼,加載到內存,會自動轉爲unicode正常顯示。)

編碼方式

1.ASCII

現在我們面臨了第一個問題:如何讓人類語言,比如英文被計算機理解?我們以英文爲例,英文中有英文字母(大小寫)、標點符號、特殊符號。如果我們將這些字母與符號給予固定的編號,然後將這些編號轉變爲二進制,那麼計算機明顯就能夠正確讀取這些符號,同時通過這些編號,計算機也能夠將二進制轉化爲編號對應的字符再顯示給人類去閱讀。由此產生了我們最熟知的ASCII碼。ASCII 碼使用指定的7 位或8 位二進制數組合來表示128 或256 種可能的字符。這樣在大部分情況下,英文與二進制的轉換就變得容易多了。
在這裏插入圖片描述

2.GB2312

雖然計算機是美國人發明的,但是全世界的人都在使用計算機。現在出現了另一個問題:如何讓中文被計算機理解?這下麻煩了,中文不像拉丁語系是由固定的字母排列組成的。ASCII 碼顯然沒辦法解決這個問題,爲了解決這個問題,中國國家標準總局1980年發佈《信息交換用漢字編碼字符集》提出了GB2312編碼,用於解決漢字處理的問題。1995年又頒佈了《漢字編碼擴展規範》(GBK)。GBK與GB 2312—1980國家標準所對應的內碼標準兼容,同時在字彙一級支持ISO/IEC10646—1和GB 13000—1的全部中、日、韓(CJK)漢字,共計20902字。這樣我們就解決了計算機處理漢字的問題了。

3.Unicode

現在英文和中文問題被解決了,但新的問題又出現了。全球有那麼多的國家不僅有英文、中文還有阿拉伯語、西班牙語、日語、韓語等等。難不成每種語言都做一種編碼?基於這種情況一種新的編碼誕生了:Unicode。Unicode又被稱爲統一碼、萬國碼;它爲每種語言中的每個字符設定了統一併且唯一的二進制編碼,以滿足跨語言、跨平臺進行文本轉換、處理的要求。Unicode支持歐洲、非洲、中東、亞洲(包括統一標準的東亞象形漢字和韓國表音文字)。這樣不管你使用的是英文或者中文,日語或者韓語,在Unicode編碼中都有收錄,且對應唯一的二進制編碼。這樣大家都開心了,只要大家都用Unicode編碼,那就不存在這些轉碼的問題了,什麼樣的字符都能夠解析了。

4.UTF-8

但是,由於Unicode收錄了更多的字符,可想而知它的解析效率相比ASCII碼和GB2312的速度要大大降低,而且由於Unicode通過增加一個高字節對ISO Latin-1字符集進行擴展,當這些高字節位爲0時,低字節就是ISO Latin-1字符。對可以用ASCII表示的字符使用Unicode並不高效,因爲Unicode比ASCII佔用大一倍的空間,而對ASCII來說高字節的0毫無用處。爲了解決這個問題,就出現了一些中間格式的字符集,他們被稱爲通用轉換格式,即UTF(Unicode Transformation Format)。而我們最常用的UTF-8就是這些轉換格式中的一種。在這裏我們不去研究UTF-8到底是如何提高效率的,你只需要知道他們之間的關係即可。

Python支持中文的編碼:
utf-8、gbk和gb2312。uft-8爲國際通用,常用有數據庫、編寫代碼。

爲什麼會出現編碼出錯

  • 無論以什麼編碼在內存裏顯示字符,存到硬盤上都是二進制,所以編碼不對,程序就會出錯
  • 存到硬盤上時是以何種編碼存的,再從硬盤上讀出來時,就必須以何種編碼讀,要不然就會出現亂碼問題

編碼轉換

Python bytes 類型

把8個二進制一組稱爲一個byte,用16進制來表示。爲的就是讓人們看起來更可讀。我們稱之爲bytes類型,即字節類型

  • 在python2裏,bytes == str , 其實就是一回事
  • 在Python 3裏將文本和二進制數據做了更爲清晰的區分。文本總是Unicode,由str類型表示,二進制數據則由byte類型表示
    • Python 3不會以任何方式混用str和bytes。我們不同拼接字符串與字節包,也無法在字節包裏搜索字符串(反之亦然),也不能將字符串傳入參數爲字節包的函數(反之亦然 )
Python3執行過程

解釋器找到代碼文件,把代碼字符串按文件頭定義的編碼加載到內存,轉成unicode,把代碼字符串按照語法規則進行解釋,所有的變量字符都會以unicode編碼聲明。在python3上 把你的代碼以utf-8編寫, 保存,然後在windows上執行,發現可以正常執行。其實utf-8編碼之所以能在windows gbk的終端下顯示正常,是因爲到了內存裏python解釋器把utf-8轉成了unicode

python2執行過程

python2 默認字符編碼是ASCII,想寫中文,就必須聲明文件頭的coding爲gbk or utf-8, 聲明之後,python2解釋器僅以文件頭聲明的編碼去解釋你的代碼,加載到內存後,並不會主動幫你轉爲unicode,也就是說,你的文件編碼是utf-8,加載到內存裏,你的變量字符串就也是utf-8。

轉換

在這裏插入圖片描述

g = "我們都是中國人"
s_to_gbk = g.encode("gbk")   
s_to_gbk1 = g.encode("gbk").decode("gbk")         #轉換成gbk並且以gbk並且顯示
s_to_utf8 = g.encode("utf8").decode("utf8")        
s_to_gb2312 = g.encode("gb2312").decode("gb2312")
print(s_to_gbk)
print(s_to_gbk1)
print(s_to_utf8)
print(s_to_gb2312)

>>
b'\xce\xd2\xc3\xc7\xb6\xbc\xca\xc7\xd6\xd0\xb9\xfa\xc8\xcb'
我們都是中國人
我們都是中國人
我們都是中國人
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章