一:編碼背景python
由於計算機只能處理數字,若是要處理文本,就必須先把文本轉換爲數字才能處理。最先的計算機在設計時採用8個比特(bit)做爲一個字節(byte),因此,一個字節能表示的最大的整數就是255(二進制11111111=十進制255),若是要表示更大的整數,就必須用更多的字節。好比兩個字節能夠表示的最大整數是65535
,4個字節能夠表示的最大整數是4294967295
。編程
因爲計算機是美國人發明的,所以,最先只有127個字符被編碼到計算機裏,也就是大小寫英文字母、數字和一些符號,這個編碼表被稱爲ASCII
編碼,好比大寫字母A
的編碼是65
,小寫字母z
的編碼是122
。編程語言
可是要處理中文顯然一個字節是不夠的,至少須要兩個字節,並且還不能和ASCII編碼衝突,因此,中國製定了GB2312
編碼,用來把中文編進去。編碼
你能夠想獲得的是,全世界有上百種語言,日本把日文編到Shift_JIS
裏,韓國把韓文編到Euc-kr
裏,各國有各國的標準,就會不可避免地出現衝突,結果就是,在多語言混合的文本中,顯示出來會有亂碼。操作系統
所以,Unicode應運而生。Unicode把全部語言都統一到一套編碼裏,這樣就不會再有亂碼問題了。設計
Unicode標準也在不斷髮展,但最經常使用的是用兩個字節表示一個字符(若是要用到很是偏僻的字符,就須要4個字節)。現代操做系統和大多數編程語言都直接支持Unicode。code
如今,捋一捋ASCII編碼和Unicode編碼的區別:ASCII編碼是1個字節,而Unicode編碼一般是2個字節。blog
新的問題又出現了:若是統一成Unicode編碼,亂碼問題今後消失了。可是,若是你寫的文本基本上所有是英文的話,用Unicode編碼比ASCII編碼須要多一倍的存儲空間,在存儲和傳輸上就十分不划算。utf-8
因此,本着節約的精神,又出現了把Unicode編碼轉化爲「可變長編碼」的UTF-8
編碼。UTF-8編碼把一個Unicode字符根據不一樣的數字大小編碼成1-6個字節,經常使用的英文字母被編碼成1個字節,漢字一般是3個字節,只有很生僻的字符纔會被編碼成4-6個字節。若是你要傳輸的文本包含大量英文字符,用UTF-8編碼就能節省空間:unicode
二:python2中的編碼問題
Python2中默認的字符編碼是ASCII碼,當出現中文時,在運行時會提示出錯
因此咱們在py文件頭部加:
# coding:utf-8
三:python3編碼問題
Python 3的源碼.py文件 的默認編碼方式爲UTF-8,因此在Python3中你能夠不用在py腳本中寫coding聲明,而且系統傳遞給python的字符再也不受系統默認編碼的影響,統一爲unicode編碼。
四:編碼轉換
檢查編碼格式
方法1
import chardet f = open('file','r') fencoding=chardet.detect(f.read()) print fencoding
方法2
from bs4 import UnicodeDammit result = UnicodeDammit(data) print dammit.original_encoding