python在進行字符串處理或者經過open函數讀取文件時,常常會出現編碼的錯誤:UnicodeDecodeE-rror: 'ascii' codec can't decode byte 0xe6 in position 0: ordinal not inpython
range(128)這個是因爲python在進行編碼和解碼的過程當中,出現編解碼不兼容時致使的錯誤。因此如今須要對字符的編碼有個清晰的認識,不須要對編解碼內部的內容進行深刻的研究,只須要了解相關編碼規則,在之後再遇到這樣的問題時能夠本身進行相關的處理就行。ide
首先咱們須要明確一點,計算機內部存儲所有采用的是0,1編碼,並非以咱們看到的字符形式出現的,好比1,2,3,漢字等這種形式進行存儲的,計算機不認識漢字或者字符,只認識0或者1,那麼這些漢字或者字符是怎麼出現的呢,就是咱們人爲的爲每一個字符進行一個特殊的編碼,而後再進行解碼,在終端或者文件中才能顯示出咱們所熟悉的字符或者漢字,而不是0或者1。函數
一、如今的字符編碼格式有ASCII編碼,Unicode編碼,UTF-8編碼編碼
1.1 ASCII編碼 spa
這是美國爲了英文字符采用的一種編碼格式,共有128個字符包括數字,大小寫字符以 及算術運算符 和邏輯運算符,其中還包括32個不能打印的特殊字符好比空格,tab鍵,換行符等。他們發現採用一 個字節的數量就能夠表示完這128個字符,由於一個字節有8個位,在這8個位上採用0或者1,則能夠 表示的狀態有2的8次冪共有256個,則每個狀態表示一個字符徹底能夠勝任。那他們就採用低7位 用來表示這些字符,最高位用0來表示。對於英文而言ASCII已經可以勝任,能夠加快經過計算機進行 信息交流的速度code
1.2 Unicode編碼orm
ASCII編碼只適用英文字符,可是世界上的語言不少,ASCII已經不能勝任了,好比中文,ASCII是不 可能進行編碼的,所以咱們國家採用的編碼時GB2312,後續還有不少標準。可是世 界上的語言很 多,人們就想着能不能採用一種統一的編碼方式,把世界上全部的編碼格式都惟一的進行標 示 unicode編碼就應運而生了,對,它就是用來對世界上全部的文字進行編碼的標準。ci
unicode編碼採用的編碼格式有UCS-8,UCS-16,UCS-32,他們採用固定的字節來標示字符進行編碼。unicode
1.3 UTF-8編碼字符串
全稱爲(Unicode Transformation Format)經過全稱咱們就能夠發現,其實UTF-8編碼是以一個字節 爲單位對unicode進行編碼。須要說明的一點是UTF-8編碼和unicode編碼是不一 樣的編碼方式。
以下表格:
Unicode編碼(16進制) | UTF-8 字節流(二進制) |
000000 – 00007F | 0xxxxxxx |
000080 – 0007FF | 110xxxxx 10xxxxxx |
000800 – 00FFFF | 1110xxxx 10xxxxxx 10xxxxxx |
010000 – 10FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
二、python的編碼處理
能夠把python比做一個水池,這個水池中有一個入口和一個出口,而這個水池中對字符串採用的處理編碼方式是unicode的,那麼在入口處須要對輸入進去的字符進行解碼操做,解碼採用的是decode()函數,能夠採用decode(這裏須要填寫此文件的編碼方式),而後經過unicode相關的庫函數對字符串進行處理,在輸出端,須要把輸出的數據進行編碼成咱們想要的格式進行存儲,採用的函數是encode(參數是咱們想要的編碼格式),對於unicode碼和咱們想要輸出的編碼格式有重複的字符時,能夠不進行編碼操做,好比數字,英文字符等,均可以直接進行存儲的。
三、python源文件的編碼格式
即xxx.py這個文件的編碼格式採用的是ASCII編碼,能夠經過sys模塊的getdefaultencoding()函數獲取默認的編碼格式,當咱們想要改變源文件的編碼格式時,須要在源文件開頭的地方輸入# _*_ coding: UTF-8進行編碼操做來改變源文件的編碼格式或者還能夠經過sys模塊的函數setdefaultencoding()來設置源文件的編碼格式。