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 字面量,可以理解為給人看的...