引言
剛接觸python的時候,第一印象就是開頭的編碼宣告,如下:
#-*-coding:utf-8-*-
然後,當我的程式出現亂碼的情況下怎麼辦?改編碼型別,試一下gbk,試一下utf-8,但也不知道問題出在哪,有些不明覺厲。後面上網找了一下相關的資料,才有點明白這個編碼宣告到底起了什麼作用,主要參考了下面兩個**:
1、 編碼宣告的作用有以下三點:
a. 宣告原始檔中將出現非ascii編碼,通常也就是中文;
新建乙個python工程時,預設是沒有出現編碼宣告的,只有在程式中出現非ascii碼的情況下才需要進行編碼宣告,否則編譯器會報出類似下面的錯誤:
syntaxerror:non-ascii character '\xc4' in file
首先,無論是英文、中文和特殊符號,在計算機內部都是以二進位制的形式儲存的,關鍵在於用什麼二進位制串表示某個具體的字元(即字元編碼),其中最為熟悉的是ascii編碼,可以表示127個字元,而python編譯器也預設將所有的字元當做ascii編碼,但是以中文字元「中」為例,如果採用gb2312編碼其對應字元值為0xd6d0,而在ascii編碼中不可能出現0xd6或者0xd0的編碼資料,因此編譯器無法識別,這個時候編碼宣告的作用就是「告訴」編譯器這一類非ascii碼字元的編碼型別。
b. 在高階的ide中,ide會將你的檔案格式儲存成你指定編碼格式;
在某些高階ide中,會自動將你的檔案格式儲存成你指定的編碼格式,如果想檢視檔案格式可以用記事本開啟然後另存為即可看到檔案的編碼型別。
c. 進行編碼轉換時採用的解碼方式;
str= u"中文";
假設上述**的「中文」採用
gb2312
編碼,即為
0xd6d0cec4
,將其轉換為
unicode
編碼經過以下兩步操作:
str.decode('gb2312').encode('utf-8')
首先用gb2312進行解碼,再重新編碼為utf-8,關鍵就在於編譯器本身並不知道字元「中文」的編碼型別,它是根據編碼宣告的指定型別進行解碼的,也就是說當實際的編碼型別和編碼宣告不一致時,就會出現亂碼,這也是出現亂碼的根本原因。
2、 操作不同編碼格式的檔案亂碼
#-*-coding:utf-8-*-
defline(filepath):
file = open(filepath,"r");
txt = file.read();
print txt;
file.close();
return;
line("e:");
將字串「中文」分別以
txt形式儲存為
ansi
編碼,然後將其讀入到記憶體中,輸出的控制台的結果如下所示:
因為在呼叫print時會將編碼轉換成本地編碼的形式輸出,預設的本地編碼為gb2312
print txt
等價於
print txt. decode(' utf-8').encode(' gb2312')
實際上「中文」採用的是gbk2312,它的編碼型別和編碼宣告不一致,但是編譯器會根據編碼宣告對字串進行解碼,因此出現亂碼,如果將輸出語句改為
printtxt. decode(' gb2312')
即可輸出正確的中文字元。
python3編碼宣告 python3編碼問題彙總
這兩天寫了個監測網頁的爬蟲,作用是跟蹤乙個網頁的變化,但執行了一晚出現了乙個問題。希望大家不吝賜教!我用的是python3,錯誤在對html response的decode時丟擲,原樣為 response urllib.urlopen dsturl content response.read dec...
編碼,解碼與亂碼的原理與亂碼解決
在做開發中肯定經常遇到亂碼這種事情,對於新手來說比較頭疼,很難解決。但其實只要等你了解的知識夠了之後,你就會發現太簡單了,而且高手是不會碰到亂碼的 首先用圖來表達這個內容,若看的懂圖,後面的長長的字就不用看了。以iso 8859 1與utf 8為例 前言在說編譯碼之前,有必要提一下為什麼要編碼,解碼...
python檔案頭的編碼宣告
可以見到這種寫法 coding utf 8 這是用來說明你的python源程式檔案用使用的編碼。預設情況下你的程式需要使用ascii碼來寫,但如果在其中寫中文的話,python直譯器一般會報錯,但如果加上你所用的檔案編碼,python就會自動處理不再報錯。但是我非常討厭寫這麼長,因為本來就因為這個編...