在python**中,寫入中文是經常出現亂碼和錯誤。
**********==知識背景**********==
1、首先看一下系統預設編碼
就是說系統預設編碼形式為ascii。
2、現在了解一下ascii和非ascii編碼
在計算機內部,所有的資訊最終都表示為乙個二進位制的字串。每乙個二進位制位(bit)有0和1兩種狀態,因此八個二進位制位就可以組合出256種狀態,這被稱為乙個位元組(byte)。
上個世紀60年代,美國制定了一套字元編碼,對英語字元與二進位制位之間的關係,做了統一規定。這被稱為ascii碼,一直沿用至今。
ascii碼一共規定了128個字元的編碼。
英語用128個符號編碼就夠了,但是用來表示其他語言,128個符號是不夠的。於是出現用更多位元組編碼比如:簡體中文常見的編碼方式是gb2312,使用兩個位元組表示乙個漢字,所以理論上最多可以表示256x256=65536個符號。這些屬於非ascii編碼。
3、unicode
正如上一節所說,世界上存在著多種編碼方式,同乙個二進位制數字可以被解釋成不同的符號。因此,要想開啟乙個文字檔案,就必須知道它的編碼方式,否則用錯誤的編碼方式解讀,就會出現亂碼。unicode編碼,將世界上所有的符號都納入其中。每乙個符號都給予乙個獨一無二的編碼。
但是,需要注意的是,unicode只是乙個符號集,它只規定了符號的二進位制**,卻沒有規定這個二進位制**應該如何儲存。這樣帶來的問題就是,計算機不知道編碼是unicode還是ascii。隨後unicode出現了多種儲存方式。
4、utf-8
utf-8就是在網際網路上使用最廣的一種unicode的實現方式。其他實現方式還包括utf-16和utf-32,不過在網際網路上基本不用。重複一遍,這裡的關係是,utf-8是unicode的實現方式之一。
utf-8和unicode可以互相轉化,比如:漢字「嚴」的unicode碼是4e25(100111000100101),utf-8編碼是e4b8a5(11100100 10111000 10100101)。
在windows下,最簡單的轉化方式是記事本。用記事本開啟檔案,檔案》另存為,最下邊「編碼」可以改變編碼儲存方式:
其中:1)ansi是預設的編碼方式。對於英文檔案是ascii編碼,對於簡體中文檔案是gb2312編碼。
2)unicode編碼指的是ucs-2編碼方式,即直接用兩個位元組存入字元的unicode碼。這個選項用的little endian格式。
3)unicode big endian編碼與上乙個選項相對應。我在下一節會解釋little endian和big endian的涵義。
4)utf-8編碼,也就是上一節談到的編碼方法。
**********==python編碼**********==
python內部是unicode編碼,也就是說通常情況下,python用unicode作為轉換中間量,decode作用為將其他編碼字串轉換為unicode,接著encode將unicode編碼轉換為其他編碼。一段例子:
# -*- coding: utf-8 -*-
s="你好"# 整個檔案是utf-8編碼,所以這裡的字串也是utf-8
u=s.decode("utf-8")# 將utf-8的str轉換為unicode
g=u.encode('gbk')# 將unicode轉換為str,編碼為gbk
print type(s),"len=",len(s)# 輸出:len= 6,utf-8每個漢字佔3位元組
print type(u),"len=",len(u)# 輸出:len= 6,unicode統計的是字數
print type(g),"len=",len(g)# 輸出:g = u.encode(『gbk『),gbk每個漢字佔2位元組
print s# 在gbk/ansi環境下(如windows),輸出亂碼,#因為此時螢幕輸出會被強制理解為gbk;
print g# 在windows下輸出「你好」
ss = '下午'.decode('utf-8')
print ss
print type(ss)
輸出為:
這樣,我們可以看到,字串utf-8和unic的相互轉化和內部儲存編碼。
**********==總結**********==
總結:unicode是支援所有文字的統一編碼,但一般只用作文字的內部表示,檔案、網頁(也是檔案)、螢幕輸入輸出等處均需使用具體的外在編碼,如gbk、utf-8等;
encode和decode都是針對unicode進行「編碼」和「解碼」,所以encode是unicode->str的過程,decode是str->unicode的過程;
unicode和str是一對孿生兄弟,來自basestring,所以用isinstance(s, basestring)來判斷s是否為字串。
Python2 中文編碼處理
今天寫了幾個指令碼,都遇到了中英文混編的情況。需求要將其中的中文標點符號切換為英文符號。舉個例子 tags 你好,good,國語 要將其中的中文半形逗號替換為英文逗號,為了方便後續的處理 如下處理 tags tags.replace 會丟擲如下異常 unicodedecodeerror ascii ...
python2 中文輸出問題
使用python查詢mysql之後的中文類似以下這種,有時候是字典,也有展示問題 x89 xe8 x8e x89 xe8 x8a xb1 xe8 怎麼正常顯示呢,兩種方案 第一 request dict print json.dumps request dict,encoding utf 8 ens...
python2中編碼問題
1.python 3 中 str 與 bytes 在 python3中,字串有兩種型別 str和bytes。在 python 3 中你定義的所有字串,都是 unicode string型別,使用 type 和 isinstance 可以判別 python3 str obj 你好 type str o...