python經常出現的字符編碼問題詳解

     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 – 00007F0xxxxxxx
000080 – 0007FF110xxxxx 10xxxxxx
000800 – 00FFFF1110xxxx 10xxxxxx 10xxxxxx
010000 – 10FFFF11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

2、python的編碼處理

    可以把python比作一個水池,這個水池中有一個入口和一個出口,而這個水池中對字符串採用的處理編碼方式是unicode的,那麼在入口處需要對輸入進去的字符進行解碼操作,解碼採用的是decode()函數,可以採用decode(這裏需要填寫此文件的編碼方式),然後通過unicode相關的庫函數對字符串進行處理,在輸出端,需要把輸出的數據進行編碼成我們想要的格式進行存儲,採用的函數是encode(參數是我們想要的編碼格式),對於unicode碼和我們想要輸出的編碼格式有重複的字符時,可以不進行編碼操作,比如數字,英文字符等,都可以直接進行存儲的。

3、python源文件的編碼格式

    即xxx.py這個文件的編碼格式採用的是ASCII編碼,可以通過sys模塊的getdefaultencoding()函數獲取默認的編碼格式,當我們想要改變源文件的編碼格式時,需要在源文件開頭的地方輸入# _*_ coding: UTF-8進行編碼操作來改變源文件的編碼格式或者還可以通過sys模塊的函數setdefaultencoding()來設置源文件的編碼格式。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章