因為Python是自帶文檔,可以通過help函數來查詢每一個系統函數的用法解釋說明。一般來說,關鍵的使用方法和注意點在這個系統的文檔中都說的很清楚。我試圖在網上找過系統文檔的中文版的函數功能解釋,但是都沒有找到,所以我決定將就使用英文版的系統自帶的函數解釋來學習。
如果你想進行Tkinter和wxPython編程,想要知道一般的widget的使用方法和屬性介紹,英文又不是太好的話,我推薦你,你可以去看看《Python與Tkinter編程》這本書,里面392頁到538頁的附錄B和附錄C選擇了常用的函數和近乎所有的屬性進行介紹,精彩不容錯過。
我上面提到的這個工具很快做好了。可以把沒有查詢過的函數進行查詢,并保存關鍵字key和查詢結果info,便于下次直接從列表list中翻出來看;要是發現沒有查過,則手動添加到列表list――就是這樣一個簡單的小工具。一切看上去都很順利。但是問題也來了:英文的info打開后,解釋里面有的單詞不知道含義,查完單詞之后想寫在info里面,保存之后可以下次直接從硬盤打開看。但是在英文info中輸入中文,保存過程中就出現了解碼不了的問題,也就是解碼到中文部分就彈出下面這個錯誤來:
UnicodeEncodeError: 'ascii' codec can't encode character u'\u6211' in position 61: ordinal not in range(128)
其中的61這個位置是彈性的,就是info中加入了中文的那個位置。這個錯誤基本一直都存在,也就是當我想要把修改過后的info寫入文件的時候:
fp = open('tt.txt','w')
fp.write(info.encode("UTF-8")) # 此處錯誤
fp.close()
這三行本身看上去沒有錯誤。但是就是在中間這行代碼處出現了錯誤。難道是encode的方式不對?我有嘗試了很多種編碼,如ANSI、UTF-8、SHIFT_JIS、GB2312、GBK等編碼,發現都不行。于是我就糊涂了。
現在我已經知道為什么錯誤了。問題就在于修改之后的info這個字符串變量。info中的數據是我從系統中通過help函數查到的字串(也就是原始的純英文的info)加上我手動輸入的中文得到的一個綜合的字符串。在我從系統中查詢系統文檔時,我對原始info進行了如下保存:
fp = open('tt.txt','w')
fp.write(info)
fp.close()
注意,錯就錯在直接將原始info直接寫入到文件中。這樣寫之后的編碼方式大家知道是什么嗎?你打開tt.txt,查看編碼方式將會知道,其編碼方式是ANSI格式。于是錯誤就是這樣產生的:我查詢關鍵字key,將這個ANSI格式的字串info讀到控件中顯示,然后我有手動的添加了UTF-8格式的中文字符,于是通連起來形成的字符串info,就是一個混亂而具有多種編碼方式的字符串info,系統怎么write都無法只使用一種編碼方式將這個混合字串info再次寫到tt.txt中去。
所以,結論就是:當你在內存中操作時,你可以隨意的不管編碼方式是什么,系統會自動的按照具體情況進行判斷。但是你如果要用到中文字符,并且還要通過文件的方式去暫時保存數據或者字串的話,請你一定要在第一次寫文件的時候用utf-8的格式寫進去,也就是如下的方式:
fp = open('tt.txt','w') fp.write(info.encode("UTF-8")) fp.close()
這將會保證你下次讀出來之后不用轉換編碼方式就可以直接打印和顯示,即使是作為控件文本也沒有問題。一定要注意這一點。
問題找到了,下面進行一些其他的討論。
有的人說,只要使用了# -*- coding:utf-8 -*-不就行了嗎?其實不然。
通過我的測試(我使用IDLE(Python2.5.4 GUI)編譯器。【1】無論我開頭用不用# -*- coding:utf-8 -*-,還是軟件中是不是設置了使用默認的utf-8編碼方式,中文在控件和文件之間的使用都是沒有問題的。【2】info='中文'; 這樣的操作都是可以的。讀的時候使用一般的讀法就可以了。原因我想是因為編譯器升級,解決了中文顯示和使用的問題,早期中文語言不能夠使用的情況現在已經不存在了。
#coding=utf-8 try: JAP=open("jap.txt","r") CHN=open("chn.txt","r") UTF=open("utf.txt","w") jap_text=JAP.readline() chn_text=CHN.readline() #先decode成UTF-16,再encode成UTF-8 jap_text_utf8=jap_text.decode("SHIFT_JIS").encode("UTF-8") #不轉成utf-8也可以 chn_text_utf8=chn_text.decode("GB2312").encode("UTF-8") #編碼方式大小寫都行utf-8也一樣 UTF.write(jap_text_utf8) UTF.write(chn_text_utf8) UTF.close() except IOError,e: print "open file error",e
這是我從//www.jb51.net/article/26542.htm中《學習python處理python編碼》文章中摘錄的代碼。這里做一下解釋,上面的jap_text_utf8和chn_text_utf8都要保證是機器默認的編碼方式,或者utf-8編碼方式,最重要的就是要保持一致。通過統一的編碼為utf-8后,就可以寫入一個文件中,再次讀出使用都沒有問題。讀的時候使用下面的普通方式即可:
filen = open('tt.txt')
info = filen.read()
print info
另外。有人使用了下面這種方式來編碼和轉換:
import sys reload(sys) sys.setdefaultencoding('utf8') def ConvertCN(s): return s.encode('gb18030') def PrintFile(filename): f = file(filename, 'r') for f_line in f.readlines(): print ConvertCN(f_line) f.close() if __name__ == "__main__": PrintFile('1.txt') print ConvertCN("\n****** 按任意鍵退出! ******") print sys.stdin.readline()
通過我的測試,這種方式是不可行的。第二行如果去掉,第三行的setdefaultencoding函數將會無效;如果保留第二行,第三行和以后的代碼都得不到執行(雖然不報錯)。這種方式是否可行請大家試試看。
? 另外,《python 中文亂碼 問題深入分析》//www.jb51.net/article/26543.htm一文中講到了很多文本如何編碼的問題,令我大開眼界。文本編碼的原理:原來就是在文本開頭處添加適當的注釋符號來表示內部的編碼方式,于是解釋器就會以某種對應的規則去按照某種步長的字節或者靈活的方式去翻譯字節,得到原文,翻譯的步長和規則完全是開頭的說明處對應的。所以,如果你正文是單個字節的編碼方式,那么你就可以在你的編碼最前頭加上一個合適的規則,告訴別人如何翻譯你的被編碼文本即可。其中BOM_UTF_8等文本末尾的知識也是很有趣的,類似的還有BOM_UTF_16等等,不同的編碼方式文末的符號不同,大家可以注意一下。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
