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