原文
亂碼産生的原因
亂碼産生的根本原因是位元組流轉換字元前後不一緻導緻。隻要掌握了這個核心,就能解決亂碼問題,在java中,由于嚴格區分了位元組流和字元,是以了解起來比較簡單。但python2中使用了一些“trick”(沒有區分字元和位元組流),是以了解起來有些困難。在python中遇到沒有指定為unicode的string,就了解為位元組流! 位元組流,沒有編碼,隻有位元組,是以在轉換字元時經常會出現亂碼。接下來說明亂碼的幾個點及解決辦法。
源檔案編碼、字元串編碼
在python中有2個地方的編碼要注意,源檔案的編碼、字元串的編碼,隻要設定正确了就不會出現亂碼。
源檔案編碼
在源檔案的第一行或者第二行一定要聲明檔案的編碼方式并且與檔案編碼一緻,通常會将源檔案儲存為utf8,聲明也是utf8,如
# coding=utf8
或
#coding:utf8
如果不指定源碼檔案編碼格式,檔案中包含非ascii字元就會出現錯誤。
SyntaxError: Non-ASCII character ‘\xe4’ in file test_encoding.py on line 3, but
no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
這是因為,如果不指定源檔案編碼,python解釋器會按照預設的字元集ascii來解碼檔案,由于中文不屬于ascii字元集,是以會出錯。

字元串編碼
字元串編碼分兩種情況,
指定了unicode:在字元串前邊加u,如u’你好’ ,這種情況不會出現亂碼;
沒指定unicode:普通字元串的寫法,如’你好’ ,這種情況字元串的編碼與源檔案編碼一緻;當字元串編碼與控制台編碼不一緻時,就會出現亂碼,這是因為python中的字元串就是位元組數組,由于沒有聲明為unicode,是以按照windows terminal的預設編碼gbk來解碼(從位元組數組轉為字元),utf8的位元組數組轉為gbk的字元,肯定是不相容的,是以出現了亂碼。如
解決辦法很簡單,指定為unicode或者使用decode函數将字元串轉為unicode編碼。如
'你好' #這裡沒有指定編碼,是以就是utf8的位元組流,輸出到控制台時,轉為gbk,因為由utf8位元組流--轉--->gbk,不相容,是以,就出現亂碼了。
u'你好' #指定字元串為unicode編碼
'你好'.decode('utf8')#将utf8的字元串解碼為unicode
因為這裡用到了decode函數,是以說一下decode、encode函數
decode(), 解碼就是将位元組流轉為字元,python中特指,其他字元集(比如,utf8、gbk、isoo8859-1)解碼為unicode
encode(),編碼就是從字元轉為位元組流,python中特指,unicode編碼為其他字元集(比如,utf8、gbk、isoo8859-1)
關于這個知識點可以這樣了解,unicode包含世界所有的字元,編碼、解碼都要圍繞unicode來進行,否則由于不相容就會出錯;從unicode到utf8就是編碼,從utf8到unicode就是解碼;
出現字元串的地方,都指定為unicode編碼。