Python字符串編碼
字符串編碼的前世今生
1. 一個字節由8個bit組成,所以1個字節能表示的最大數為255;
2. 計算機是美國人發明的,所以一個字節可以表示所有的字符了,所以ASCII就成為美國人的標准編碼;
3.但是ASCII編碼處理漢字是明顯不夠的,中文不止255個漢字,所以中國制定GB2312編碼,用兩個字節表示一個漢字,GB2312還把ASCII包含進去了,同理,日文。韓文等等上百個國家為了解決問題都發展了一套字節的編碼,標准就越來越多,如果出現多種語言混合現實就一定會亂碼;
4.這時候出現了Unicode編碼,將所有的標准統一到了一套編碼里面;
5.那ASCII編碼和Unicode編碼之間是如何進行轉換的?下面是具體的轉換方法:
5.1 字母A用ASCII編碼表示的十進制是65,二進制即為0100 0001
5.2 漢字“中”已經超出了ASCII編碼的范圍,用Unicode編碼十進制是20013 二進制是0100 1110 0010 1101
5.3 A字母用Unicode編碼時只需要在前面補上0 即為0000 0000 0100 0001
6.亂碼問題解決了,但是同時又出現了一個新的問題,如果全部是英文字母的話,Unicode編碼比ASCII編碼多消耗一倍的內存,同時網絡傳輸的時候也多消耗一倍的帶寬;
7.所以這個時候出現了長度可變化的utf-8的編碼。
字符與字節
1byte = 8bit 1KB = 1024 bytes 1MB = 1024KB 1GB = 1024MB 1TB = 1024GB
ASCII編碼: 一個英文字母占據一個字節的空間,一個中文字母占據兩個字節的空間;
utf-8編碼: 一個英文字符等於一個字節,一個中文(含繁體)等於三個字節。中文標點占據三個字節,英文標點占據一個字節;
Unicode編碼: 一個英文等於兩個字節,一個中文(含繁體)等於兩個字節。中文標點占據兩個字節,英文標點占據兩個字節。
Unicode編碼為GB2312編碼 utf-8編碼 ASCII等編碼的一個父級編碼,那這些子編碼之間子在需要相互轉換的時候就需要借助父級編碼Unicode。子編碼是可以直接轉換為父級編碼,然后父級編碼轉換為另一種類型的子編碼。
Python2和Python3字符編碼存在的問題
獲取默認編碼格式:
>>> import sys
>>> sys.getdefaultencoding()
我們發現在python2中默認的編碼格式是 'ascii' 編碼,在python3中默認的編碼格式為utf-8
第一步:在終端輸入python進入python2的開發環境
第二步:s = "中國" # 獲取s的值拿到 '\xe4\xb8\xad\xe5\x9b\xbd' 說明此時的ASCII編碼無法識別漢字
Python2和Python3字符編碼問題的解決方案
import sys
defaultencoding = 'utf-8'
if sys.getdefaultencoding() != defaultencoding: reload(sys) sys.setdefaultencoding(defaultencoding)
