來來來,最後一點東西。扯完了這個系列就暫時結束了,而後我就能夠滾去再次開始憋代碼……當有了比較大的更新或者長了比較大的姿式的時候,這個系列還會更新。極有可能的是,前幾篇討論的東西,會推倒重來一部分……嘛,都習慣了是吧?php
這篇文章討論兩個問題:python
1.跨平臺的字符編碼linux
2.文本框中字符對齊git
python字符編碼問題一直是個痛----我不太清楚別的語言是否也會糾結這個(貌似我記得php會?昨天看的那個神翻譯文章php迎風撒尿什麼的,印象深入)。之前我在寫另外一個程序的時候,用了一點小手段解決了跨平臺print輸出的問題,可是一樣的方法,對於文本讀取的編碼問題是無能爲力的。windows
python的編碼問題,開源中國有一些很棒的文章,請圍觀:Python、Unicode和中文 這篇也不錯:轉-Python Unicode與中文處理app
相比起上面那些研究獨到的文章,我這裏只是一個小方法而已,恩,就這樣。測試
衆所周知,linux下字符編碼一般是utf8,windows是gb2312,linux的行尾是\n,windows是\r\n。windows下,直接讀取linux系統編輯過的文本,全是亂碼。反之亦然。一般使用的方法,好比很容易看見的這個:a.decode('gb2312').encode('utf8') 事實上我試驗的結果來看,真不太好用。我用print測試過,windows下,直接 open('xxx').read() 一個在linux系統中編輯的文件,已是全亂碼了,既然讀入就已經全是亂碼了,後面再編碼解碼,都是抓瞎。據說 open('xxx',encode='utf8') 挺好使的,我沒實驗過……ui
由於嫌麻煩,我乾脆不在程序裏面解碼,直接linux下gedit把script文本轉成gbk格式……這樣的話,windows系統下,程序裏面只須要 text.decode('gb2312')就能夠了。事實上,也不算太麻煩。順便說一句,事實上gb2312不太靠譜,若是出現了日文什麼的就會抓狂了。這樣的話 gb18030更靠譜一點。編碼
這個代碼很醜,別吐槽了,接下來還有更醜的(笑):spa
if platform.system() == 'Windows': WINDOWS = 1 else: WINDOWS = 0 ## 這只是一個示例,總之,出現了文本的話,加入 ## 這幾句準沒錯 if WINDOWS: name = name.decode('gb18030') text = text.decode('gb18030') else: name = name.decode('utf8') text = text.decode('utf8')
雖然很水,不過這個問題就算過去了。接下來是文本框對齊的問題,這個問題我在第二篇(或者是第三篇?)提出過但願高人解答。因而@solu跳了出來(笑),提出了一種解決方式,利用kitchen中的方法,能夠比較完美的解決這個問題。我嘗試了一下這個方法,確實至關好用。不事後來在觀察輸出結果的時候,發現了性質:對於普通的ascii符號,例如數字,字母,英文符號……都是佔據了一個字符位置。而漢字,日文符號,佔據兩個字符位置。具體的請看一下這張圖片:
對吧。事實上,兩個ascii字符的寬度,正好是一個漢字或者日文的寬度。這樣,多行字符對齊這個問題中,沒法獲取字符寬度的這個問題就解決了。令一行寬度爲70個字符寬度(試驗的結果),記一個ascii字符寬度爲1,非ascii字符寬度爲2,而後一個簡單的判斷就行了。值得注意的是,因爲傳入的字符全是unicode類型的。通常的isalpha方法不太好用,就直接用一個大字符串枚舉就好……
這代碼至關爛,有高手能把它寫得優雅一些,就是幫了大忙了。嗯哼,@solu~~~~
## 別吐槽了…… CHAR = u'''abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-=[]:;{}+_,.?!()@<>""''/\\''' def textToList(self,text): width = 0 textList = [] textStr = '' for i in text: if i in CHAR or i.isdigit() or i.isspace(): width += 1 else: width += 2 textStr += i if width >= LINENUMBER * 2 - 1: textList.append(textStr) textStr = '' width = 0 textList.append(textStr) return textList
效果的話,如今是這樣:
而後……那就到此爲止吧。這個系列暫時告一段落。感謝solu,感謝JekyCui以及感謝全部閱讀過我文章的人,感謝全部推薦過galgame給個人人。感謝~~~