字符編碼python
由於計算機只能處理數字,若是要處理文本,就必須先把文本轉換爲數字才能處理。最先的計算機在設計時採用8個比特(bit)做爲一個字節(byte),因此,一個字節能表示的最大的整數就是255(二進制11111111=十進制255),若是要表示更大的整數,就必須用更多的字節。好比兩個字節能夠表示的最大整數是65535,4個字節能夠表示的最大整數是4294967295。性能
因爲計算機是美國人發明的,所以,最先只有127個字母被編碼到計算機裏,也就是大小寫英文字母、數字和一些符號,這個編碼表被稱爲ASCII編碼,好比大寫字母A的編碼是65,小寫字母z的編碼是122。編碼
可是要處理中文顯然一個字節是不夠的,至少須要兩個字節,並且還不能和ASCII編碼衝突,因此,中國製定了GB2312
編碼,用來把中文編進去。spa
如今英文和中文問題被解決了,但新的問題又出現了。全球有那麼多的國家不只有英文、中文還有阿拉伯語、西班牙語、日語、韓語等等。難不成每種語言都作一種編碼?基於這種狀況一種新的編碼誕生了:Unicode。Unicode又被稱爲統一碼、萬國碼;它爲每種語言中的每一個字符設定了統一而且惟一的二進制編碼,以知足跨語言、跨平臺進行文本轉換、處理的要求。Unicode支持歐洲、非洲、中東、亞洲(包括統一標準的東亞象形漢字和韓國表音文字)。這樣無論你使用的是英文或者中文,日語或者韓語,在Unicode編碼中都有收錄,且對應惟一的二進制編碼。這樣你們都開心了,只要你們都用Unicode編碼,那就不存在這些轉碼的問題了,什麼樣的字符都可以解析了。設計
因爲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究竟是如何提升效率的,你只須要知道他們之間的關係便可。code
總結:
一、爲了處理英文字符,產生了ASCII碼。
二、爲了處理中文字符,產生了GB2312。
三、爲了處理各國字符,產生了Unicode。
四、爲了提升Unicode存儲和傳輸性能,產生了UTF-8,它是Unicode的一種實現形式。orm
Python2的默認編碼是ASCII碼,Python3的默認編碼是UTF-8blog
1、python2 與 python3 通用的編碼方式內存
一、UTF-8編碼方式: utf-8
英文 :A 00100000 8位 1字節
中文: 中 00000001 00000010 00001110 24位 3字節
二、GBK編碼方式:
英文: A 00000110 8位 1字節
中文: 中 00000010 00000110 16位 2字節
各個編碼之間二進制,是不能互相識別的,會產生混亂
文件之間的儲存、傳輸、不能用Unicode碼(由於所佔用的空間太大),只能用UTF-八、UTF-1六、GBK、GB23十二、ASCII碼
三、str在Python中是用Unicode碼,還有一種是bytes 類型
一、英文
str:
表現形式 s = 'alex'
編碼方式 0101010101 unicode
bytes:
表現形式 s = b'alex'
編碼方式 00101010 utf-8 gbk
二、中文
str:
表現方式 s= '中國'
編碼方式 01010110 utf-8 gbk
bytes:
表現方式 b'x\e91\e91\e01\e21\e31\e32
編碼方式 01001100 utf-8 gbk
2、字符編碼的使用
不論是哪一種類型的文件,只要記住一點:文件以什麼編碼保存的,就以什麼編碼方式打開。
在計算機內存中,統一使用Unicode編碼,當須要保存到硬盤或者須要傳輸的時候,就轉換爲UTF-8編碼。
總結: decode()方法將其餘編碼字符轉化爲Unicode編碼字符。 encode()方法將Unicode編碼字符轉化爲其餘編碼字符。