--內容來自廖雪峰的python3.x教程,invert your own computer Games with python,python核心編程
編碼格式
ASCII編碼和Unicode編碼的區別:ASCII編碼是1個字節,而Unicode編碼通常是2個字節
字母A用ASCII編碼是十進制的65,二進制的01000001。
如果把ASCII編碼的A用Unicode編碼,只需要在前面補0就可以,因此,A的Unicode編碼是00000000 01000001。
問題出現了:如果統一成Unicode編碼,亂碼問題從此消失了。但是,如果寫的文本基本上全部是英文的話,用Unicode編碼比ASCII編碼需要多一倍的存儲空間,在存儲和傳輸上就十分不劃算。
所以,本著節約的精神,又出現了把Unicode編碼轉化為“可變長編碼”的UTF-8編碼。UTF-8編碼把一個Unicode字符根據不同的數字大小編碼成1-6個字節,常用的英文字母被編碼成1個字節,漢字通常是3個字節,只有很生僻的字符才會被編碼成4-6個字節。如果你要傳輸的文本包含大量英文字符,用UTF-8編碼就能節省空間:
? ?字符 ? ? ? ? ? ?ASCII ? ? ? ? ? ? ? ? ? ? ? Unicode ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? UTF-8
? ? ?A ? ? ? ? ? ? 01000001 ? ? ? ? ? 00000000 01000001 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?01000001
? ? ?中 ? ? ? ? ? ? ? ? ? ? / ? ? ? ? ? ? ? ? 01001110 0010110111100100 ? ? ? ? ? ? ? ?10111000 10101101
UTF-8兼容ASCII,所以UTF-8可以兼容那些那些老舊編碼的軟件。
理解了三者的聯系后,我們討論現代計算機中通用的編碼格式:
內存中統一用unicode編碼,當需要保存或者傳輸到設備時轉為UTF-8編碼。用記事本編輯的時候,從文件讀取的UTF-8字符被轉換為Unicode字符到內存里,編輯完成后,保存的時候再把Unicode轉換為UTF-8保存到文件。
瀏覽網頁時,服務器會把unicode編碼的數據轉化成UTF-8傳輸給瀏覽器,所以我們可以到看到很多網頁都會有<meta charset='utf-8' />
python字符串
python3中的字符串是unicode編碼,所以支持多國語言。
ord()函數獲取字符編碼整數,chr()則返回對應字符。
python中字符串類型是str,代表一個或多個字節。如果需要傳輸或者保存,需要用到bytes類型數據。對bytes類型的數據的處理,python是這樣表示的:
byt = b"string"
“string”和b“string”是有區別的。
Unicode表示的str可以通過encode()方法變成bytes類型。
純英文的str可以用ASCII編碼為bytes,內容是一樣的,含有中文的str可以用UTF-8編碼為bytes。含有中文的str無法用ASCII編碼,因為中文編碼的范圍超過了ASCII編碼的范圍,Python會報錯。
在bytes中,無法顯示為ASCII字符的字節,用\x##顯示。
反過來,如果我們從網絡或磁盤上讀取了字節流,那么讀到的數據就是bytes。要把bytes變為str,就需要用decode()方法。
由于Python源代碼也是一個文本文件,所以,當你的源代碼中包含中文的時候,在保存源代碼時,就需要務必指定保存為UTF-8編碼。當Python解釋器讀取源代碼時,為了讓它按UTF-8編碼讀取,我們通常在文件開頭寫上這兩行:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
第一行注釋是為了告訴Linux/OS X系統,這是一個Python可執行程序,Windows系統會忽略這個注釋;
第二行注釋是為了告訴Python解釋器,按照UTF-8編碼讀取源代碼,否則,你在源代碼中寫的中文輸出可能會有亂碼。
申明了UTF-8編碼并不意味著你的.py文件就是UTF-8編碼的,必須并且要確保文本編輯器正在使用UTF-8 without BOM編碼。