python的編碼與解碼

2022-04-16 12:39:14 字數 4342 閱讀 1539

1.特殊情況

\xe5\xae\x9d\xe9\x

python2控制台bai輸出會有這種情況,包括以下list裡面的漢字雖du然是utf8格式的但仍然zhi不可見中文。

只需要包要檢視的list轉為str並decode("string_escape")

例子為:

li = [((33, 39), '寶馬'), ((36, 39), '馬')]

print str(li).decode("string_escape")

輸出就是可檢視的樣式 [((33, 39), '寶馬'), ((36, 39), '馬')]

2.編碼與解碼

在解決錯誤之前,首先要了解unicode和utf-8的區別。

unicode指的是萬國碼,是一種「字碼表」。而utf-8是這種字碼表儲存的編碼方法。unicode不一定要由utf-8這種方式編成bytecode儲存,也可以使用utf-16,utf-7等其他方式。目前大多都以utf-8的方式來變成bytecode。

其次,python中字串型別分為byte string 和 unicode string兩種。

如果在python檔案中指定編碼方式為utf-8(#coding=utf-8),那麼所有帶中文的字串都會被認為是utf-8編碼的byte string(例如:mystr="你好"),但是在函式中所產生的字串則被認為是unicode string。

問題就出在這邊,unicode string 和 byte string 是不可以混合使用的,一旦混合使用了,就會產生這樣的錯誤。例如:

self.response.out.write("你好"+self.request.get("argu"))

其中,"你好"被認為是byte string,而self.request.get("argu")的返回值被認為是unicode string。由於預設的解碼器是ascii,所以就不能識別中文byte string。然後就報錯了。

以下有兩個解決方法:

1.將字串全都轉成byte string。

self.response.out.write("你好"+self.request.get("argu").encode("utf-8"))

2.將字串全都轉成unicode string。

self.response.out.write(u"你好"+self.request.get("argu"))

byte string轉換成unicode string可以這樣轉unicode(unicodestring, "utf-8")

我的經驗:

我是畫圖的時候,從資料框中取出的序列列名是中文的,序列不僅包括其中的資料,還有列名,於是整個的編碼就是混合的,不是byte string(在開頭規定了#coding = utf-8),畫圖時總是報 

'ascii' codec can'tdecode byte 0xef in position 0: ordinal not in range(128)『

解決方式:

一般而言編碼錯誤採用轉碼,unicode,encode等,但是這些操作是對於string而言,這裡是序列,不便於操作,於是

(1)改變預設的編碼方式

import sys

reload(sys)

sys.setdefaultencoding('utf-8')

問題可以得到解決,但是在notebook中不在顯示print後的內容,不太想用。

(2)將序列中的值取出來,不用序列畫圖,而是用多維陣列畫圖

s.values

問題也可以解決。

(3)後來發現當dataframe列名包含中文,還需要新增橫軸座標,不得不用到中文,此時整個列名顯示好像是uicode編碼

index([u'全部', u'加賠'], dtype='object')

但是整個加入橫軸座標設定就是報錯,編碼不對,單個取出

'\xe5\x85\xa8\xe9\x83\xa8'

顯然不是unicode(不知道為什麼會這樣??)

用判斷也表示不是uicode

isinstance(x_ticks1[0], unicode)

false

可以用str.decode('utf8')只能單個str用,序列沒有這個功能,轉為unicode,就對了。後來畫圖是可以顯示中文了,不過還是很疑惑為什麼?

首先要搞清楚,字串在python內部的表示是unicode編碼,因此,在做編碼轉換時,通常需要以unicode作為中間編碼,即先將其他編碼的字串解碼(decode)成unicode,再從unicode編碼(encode)成另一種編碼。

decode的作用是將其他編碼的字串轉換成unicode編碼,如str1.decode('gb2312'),表示將gb2312編碼的字串轉換成unicode編碼。

encode的作用是將unicode編碼轉換成其他編碼的字串,如str2.encode('gb2312'),表示將unicode編碼的字串轉換成gb2312編碼。

在某些ide中,字串的輸出總是出現亂碼,甚至錯誤,其實是由於ide的結果輸出控制台自身不能顯示字串的編碼,而不是程式本身的問題。

例如:ljq.py,編碼為utf8,包含內容如下:

#-*-coding:utf-8-*- 

s='中文'

print type(s) #檢視s的字元型別

print s

s.decode('utf8') #解碼utf8,預設的編碼方式是unicode

s.decode('gbk', "ignore") #解碼utf8,忽略其中有異常的編碼,僅顯示有效的編碼

s.decode('gbk', 'replace')

print type(s)

print s

s.encode('gb2312') ##編碼為utf8

print type(s)

print s

ljq.py編碼必需與s.decode('utf8')指定的編碼一致,不然會丟擲解碼異常資訊,可以通過s.decode("gbk", "ignore")或s.decode("gbk", "replace")來解決。

另外對於一些包含特殊字元的編碼,直接解碼可能會報錯,可以使用對於的引數來設定。如:

s.decode("utf-8", "ignore") 忽略其中有異常的編碼,僅顯示有效的編碼

s.decode("utf-8", "replace") 替換其中異常的編碼,這個相對來可能一眼就知道那些字元編碼出問題了。

從unicode轉str,被看做是把乙個資訊文字編碼為二進位制位元組流的過程,要用encode方法

首先要搞清楚,字串在python內部的表示是unicode編碼,因此,在做編碼轉換時,通常需要以unicode作為中間編碼,即先將其他編碼的字串解碼(decode)成unicode,再從unicode編碼(encode)成另一種編碼。

decode的作用是將其他編碼的字串轉換成unicode編碼,如str1.decode('gb2312'),表示將gb2312編碼的字串轉換成unicode編碼。

encode的作用是將unicode編碼轉換成其他編碼的字串,如str2.encode('gb2312'),表示將unicode編碼的字串轉換成gb2312編碼。

在某些ide中,字串的輸出總是出現亂碼,甚至錯誤,其實是由於ide的結果輸出控制台自身不能顯示字串的編碼,而不是程式本身的問題。

例如:ljq.py,編碼為utf8,包含內容如下:

#-*-coding:utf-8-*- 

s='中文'

print type(s) #檢視s的字元型別

print s

s.decode('utf8') #解碼utf8,預設的編碼方式是unicode

s.decode('gbk', "ignore") #解碼utf8,忽略其中有異常的編碼,僅顯示有效的編碼

s.decode('gbk', 'replace')

print type(s)

print s

s.encode('gb2312') ##編碼為utf8

print type(s)

print s

ljq.py編碼必需與s.decode('utf8')指定的編碼一致,不然會丟擲解碼異常資訊,可以通過s.decode("gbk", "ignore")或s.decode("gbk", "replace")來解決。

另外對於一些包含特殊字元的編碼,直接解碼可能會報錯,可以使用對於的引數來設定。如:

s.decode("utf-8", "ignore") 忽略其中有異常的編碼,僅顯示有效的編碼

s.decode("utf-8", "replace") 替換其中異常的編碼,這個相對來可能一眼就知道那些字元編碼出問題了。

從unicode轉str,被看做是把乙個資訊文字編碼為二進位制位元組流的過程,要用encode方法

Python 編碼與解碼

字串型別是對人類友好的符號,但計算機只認識一種符號,那就是二進位制 binary 數,或者說是數字。為了用計算機可以理解的數字描述人類使用的字元,我們需要一張數字與字元對應的表。我們都知道在計算機中 1 byte 8bits,可以儲存 0 255共256個值,也就是說 1byte最多可以表示 256...

python的編碼與解碼

python中的字元型別 python中的字元型別分兩種 1.str型別 ascii表中的字元,佔乙個位元組,所以也叫位元組字元。字面量用雙引號表示。s ok,u u 我,u1 u 我 u2 u 愛python print s s print u1 u1 print u2 u2 解析器通常把unic...

編碼與解碼 python 經驗

位元 bit 也稱二進位制位,指二進位制中的一位,是計算機資訊的最小單位。bit是binary digit 二進位制數字 的縮寫,還可被縮寫為b。位元組 港澳台稱位元組,byte 乙個位元組代表8個位元,也被縮寫為b,在工業標準 網路 電信技術中也被成為八位組 octet 字面量,可以理解為給人看的...