有關(guān)Python中文問題進(jìn)行詳細(xì)說明
在講解Python中文問題之前,先說一下什么是Python,前一陣對Python產(chǎn)生了濃厚的興趣,誰知道跟中文問題這個(gè)老朋友又一次不期而遇,看來,在代碼中,Python中文的問題總是常常的困擾著我們的。。
這也難怪,誰讓當(dāng)初發(fā)明計(jì)算機(jī)的不是我們中國人呢,否則,現(xiàn)在全世界的計(jì)算機(jī)都支持而且必須支持GBK,這樣。寫這樣文章的人就不會是我了,而是大洋彼岸的一個(gè)金發(fā)碧眼的程序員,而且標(biāo)題也相應(yīng)改為 “studying the english problem in '大蟒' ”。
還是面對現(xiàn)實(shí)問題吧。相對java而言,中文問題在Python中的表現(xiàn)更為激烈?!凹ち摇钡囊馑疾皇钦f更為嚴(yán)重或者說難于解決。只是 Python對于decode&encode錯(cuò)誤的默認(rèn)處理方式為strict,也就是直接報(bào)錯(cuò),而java使用replace的方式來處理了,因此 java出現(xiàn)中文問題后會打印出很多"??"。
此外,Python的默認(rèn)的encoding是ASCII,而java的默認(rèn)encoding跟操作系統(tǒng)的 encoding是一致的。在這一點(diǎn)上,我覺得java更為合理,這樣對程序員更為友好,也減少了newbies 開始時(shí)的挫折感,是有利于語言的推廣的。
但是,Python也有它的道理,畢竟ASCII是***的全世界所有平臺都支持的字符集,而且問題始終是問題,始終會出現(xiàn)的,逃避它還不如早點(diǎn)面對它。好了,說了這么多,該說說Python中中文問題的癥狀了。在這之前,我們先要了解Python中有兩種字符串,分別是一般的字符串(每個(gè)字符用8 bits表示)和Unicode字符串(每個(gè)字符用一個(gè)或者多個(gè)字節(jié)表示)。
它們可以相互轉(zhuǎn)換,有著更為全面的描述,在此我就不再多說什么了。來看下面的代碼:
- # -*- coding:gb2312 -*- #必須在***行或者第二行
- print "-------------code 1----------------"
- a = "中文a我愛你"
- print a
- print a.find("我")
- b = a.replace("愛", "喜歡")
- print b
- print "--------------code 2----------------"
- x = "中文a我愛你"
- y = unicode(x, "gb2312")
- print y.encode("gb2312")
- print y.find(u"我")
- z = y.replace(u"愛", u"喜歡")
- print z.encode("gb2312")
- print "---------------code 3----------------"
- print y
說是遇到非ASCII字符了,并讓我們參考pep-0263。PEP-0263(Python Enhancement Proposal)上面說得很清楚了,Python也意識到了國際化問題,并提出了解決方案。根據(jù)提案上面的要求,我們有如下代碼:
- -------------code 1----------------
- 中文a我愛你
- 5
- 中文a我喜歡你
- --------------code 2----------------
- 中文a我愛你
- 3
- 中文a我喜歡你
- ---------------code 3----------------
- Traceback (most recent call last):
- File "G:\Downloads\eclipse\workspace\p\src\hello.py", line 16, in <module>
- print y
- UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
我們可以看到,通過引入Python中文問題聲明,我們可以正常地在使用中文了,而且在code 1和2中,控制臺也能正確的把中文打印出來。但是,很明顯,上面的代碼也反映出了不少的問題:
1、code 1 和 2在使用print時(shí)采用了不同的方式,1是直接print,而2在print之前先進(jìn)行編碼
2、code 1 和 2中在同樣的字符串查找同一個(gè)字符“我”,得出的結(jié)果不一樣(分別是5和3)
3、code 3 中直接打印unicode字符串 y時(shí)出現(xiàn)錯(cuò)誤(這也是為什么code 2中要先進(jìn)行編碼的原因)
【編輯推薦】