Python是一種面向?qū)ο蟮慕忉屝陀嬎銠C(jī)程序設(shè)計語言,由荷蘭人發(fā)明,第一個公開發(fā)行版發(fā)行于1991年。Python是純粹的自由軟件,源代碼和解釋器CPython遵循 GPL協(xié)議。Python語法簡潔清晰,特色之一是強(qiáng)制用空白符作為語句縮進(jìn)。
Python具有豐富和強(qiáng)大的庫。它常被昵稱為膠水語言,能夠把用其他語言制作的各種模塊(尤其是C/C++)很輕松地聯(lián)結(jié)在一起。常見的一種應(yīng)用情形是,使用Python快速生成程序的原型(有時甚至是程序的最終界面),然后對其中有特別要求的部分,用更合適的語言改寫,比如3D游戲中的圖形渲染模塊,性能要求特別高,就可以用C/C++重寫,而后封裝為Python可以調(diào)用的擴(kuò)展類庫。需要注意的是在您使用擴(kuò)展類庫時可能需要考慮平臺問題,某些可能不提供跨平臺的實現(xiàn)。
Python ascii 編碼轉(zhuǎn)化為utf-8編碼
實現(xiàn)代碼如下:
123456a = ‘a(chǎn)bce’
# print type(a)
b = a.decode(“ascii”)
# print type(b)
c = a.decode(“ascii”).encode(“utf-8”)
# print type(c)
在python中進(jìn)行編碼轉(zhuǎn)換都是通過unicode作為中間值實現(xiàn)的。所以要先decode成unicode字符,然后再使用encode轉(zhuǎn)換成utf-8編碼的str。可以把注釋取消了,看下轉(zhuǎn)換過程中的類型。
ASCII 是一種字符集,包括大小寫的英文字母、數(shù)字、控制字符等,它用一個字節(jié)表示,范圍是 0-127 Unicode分為UTF-8和UTF-16。
UTF-8變長度的,最多 6 個字節(jié),小于 127 的字符用一個字節(jié)表示,與 ASCII 字符集的結(jié)果一樣,ASCII 編碼下的英語文本不需要修改就可以當(dāng)作 UTF-8 編碼進(jìn)行處理。
Python 從 2.2 開始支持 Unicode ,函數(shù) decode( char_set )可以實現(xiàn) 其它編碼到 Unicode 的轉(zhuǎn)換,函數(shù) encode( char_set )實現(xiàn) Unicode 到其它編碼方式的轉(zhuǎn)換。
比如
[python] view plain copy(“你好”).decode( “GB2312”)
將得到
u‘\u4f60\u597d’,
即 “你”和“好“的 Unicode 碼分別是 0x4f60 和 0x597d
再用
[python] view plain copy(u‘\u4f60\u597d’).encode(”UTF-8“)
將得到
‘\xe4\xbd\xa0\xe5\xa5\xbd’
它是 “你好”的UTF-8編碼結(jié)果。
python中使用 unicode的關(guān)鍵:unicode是一個類,函數(shù)unicode(str,”utf8“)從utf8編碼(當(dāng)然也可以是別的編碼)的字符串str生成 unicode類的對象,而函數(shù)unc.encode(”utf8“)將unicode類的對象unc轉(zhuǎn)換為(編碼為)utf8編碼(當(dāng)然也可以是別的編碼)的字符串。于是,編寫unicode相關(guān)程序,需要做的事情是 * 獲取數(shù)據(jù)(字符串)時,用unicode(str, ”utf8“)生成unicode對象 * 在程序中僅使用unicode對象,對程序中出現(xiàn)的字符串常量都以u”字符串“的形式書寫 * 輸出時,可將unicode對象轉(zhuǎn)換為任意編碼輸出,使用str.encode(”some_encoding“)
[python] view plain copy》》》 unicode(”你好“, ”utf8“)
u‘\u4f60\u597d’
》》》 x = _
》》》 type(x)
》》》 type(”你好“)
》》》 x.encode(”utf8“)
‘\xe4\xbd\xa0\xe5\xa5\xbd’
》》》 x.encode(”gbk“)
‘\xc4\xe3\xba\xc3’
》》》 x.encode(”gb2312“)
‘\xc4\xe3\xba\xc3’
》》》 print x
你好
》》》 print x.encode(”utf8“)
你好
》》》 print x.encode(”gbk“)
???
以上是測試結(jié)果(Ubuntu 6.06,locale為utf8),注意type(x)和type(”你好“)的區(qū)別。從編碼上可以看出utf8編碼與gbk不同。在utf8的 locale設(shè)置下,打印x按該環(huán)境變量編碼(我猜我猜我猜猜猜),而打印x.encode(”gbk“)則是亂碼。
python編碼亂碼問題ascii unicode utf-8
基礎(chǔ)知識部分
首先需明白python2.7默認(rèn)使用的是ascii,而現(xiàn)在python3.x默認(rèn)使用的是unicode。下面內(nèi)容基于python2.7。
一、文件編碼
一般文件使用的是utf-8或者bgk編碼進(jìn)行存儲。但是由于python2.7默認(rèn)使用ascii,所以python2.7在運行py后綴文件時也是默認(rèn)以ascii編碼讀取文件。如果文件中沒有中文不會出現(xiàn)問題。但是如果有中文的話,由于中文編碼超出了ascii編碼范圍,所以python2.7將會報錯。
所以我們需要在文件頭部添加:
#coding:utf-8
或者
#!/usr/bin/python
# -*- coding: utf-8 -*-1234
來告訴python2.7此文件要用utf-8編碼來讀取。
在文件中設(shè)置后我們可以使用 a = u‘哈’;python會自動使用utf-8來讀取漢字,并將其轉(zhuǎn)換為Unicode對象。1
二、字符串編碼
python2.7和字符串相關(guān)的數(shù)據(jù)類型,分別是標(biāo)準(zhǔn)字符串(str)是單字節(jié)字符序列,Unicode字符串(unicode)是雙字節(jié)字符序列。。
python的解碼,編碼是python自動進(jìn)行的,如果我們沒有指明解碼方式,python 就會使用 sys.defaultencoding 指明的方式來解碼。python2.7的函數(shù)str()和unicode()默認(rèn)將對象轉(zhuǎn)成ascii編碼。
但是對于中文,ascii編碼是無法表示的。因此我們需要用sys.setdefaultencoding(‘utf-8’)來設(shè)置string對象默認(rèn)的編碼。
import sys
reload(sys)
sys.setdefaultencoding(‘utf-8’) 123
那么字符串如何在str和unicode間進(jìn)行轉(zhuǎn)換呢?python提供了兩個函數(shù):
b = u‘哈’ //b為unicode對象
b.encode(‘utf-8’) //將b從unicode類型轉(zhuǎn)為utf-8類型
b.decode(‘utf-8’) //將b從utf-8類型轉(zhuǎn)換為Unicode類型123
三、window控制臺輸出
window控制臺默認(rèn)使用gbk編碼。如果你設(shè)置了
# -*- coding: utf-8 -*-1
python直接按照utf-8輸出到控制臺。所以我們可以改變文件編碼:
# -*- coding: gbk -*-1
或者使用unicode類型進(jìn)行輸出,會自動轉(zhuǎn)換。
評論
查看更多