python製做galgame引擎(EX)

  來來來,最後一點東西。扯完了這個系列就暫時結束了,而後我就能夠滾去再次開始憋代碼……當有了比較大的更新或者長了比較大的姿式的時候,這個系列還會更新。極有可能的是,前幾篇討論的東西,會推倒重來一部分……嘛,都習慣了是吧?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給個人人。感謝~~~

相關文章
相關標籤/搜索