python制作galgame引擎(EX)

浪尽此生 提交于 2019-11-27 14:58:01

  来来来,最后一点东西。扯完了这个系列就暂时结束了,然后我就可以滚去再次开始憋代码……当有了比较大的更新或者长了比较大的姿势的时候,这个系列还会更新。极有可能的是,前几篇讨论的东西,会推倒重来一部分……嘛,都习惯了是吧?

  这篇文章讨论两个问题:

  1.跨平台的字符编码

  2.文本框中字符对齐

   

  python字符编码问题一直是个痛----我不太清楚别的语言是否也会纠结这个(貌似我记得php会?昨天看的那个神翻译文章php迎风撒尿什么的,印象深刻)。以前我在写另一个程序的时候,用了一点小手段解决了跨平台print输出的问题,但是同样的方法,对于文本读取的编码问题是无能为力的。

  python的编码问题,开源中国有一些很棒的文章,请围观:Python、Unicode和中文 这篇也不错:转-Python Unicode与中文处理

  相比起上面那些研究独到的文章,我这里只是一个小方法而已,恩,就这样。

  众所周知,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') 挺好使的,我没实验过……

  因为嫌麻烦,我干脆不在程序里面解码,直接linux下gedit把script文本转成gbk格式……这样的话,windows系统下,程序里面只需要 text.decode('gb2312')就可以了。事实上,也不算太麻烦。顺便说一句,事实上gb2312不太靠谱,如果出现了日文什么的就会抓狂了。这样的话 gb18030更靠谱一点。

  这个代码很丑,别吐槽了,接下来还有更丑的(笑):

   

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给我的人。感谢~~~

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!