来来来,最后一点东西。扯完了这个系列就暂时结束了,然后我就可以滚去再次开始憋代码……当有了比较大的更新或者长了比较大的姿势的时候,这个系列还会更新。极有可能的是,前几篇讨论的东西,会推倒重来一部分……嘛,都习惯了是吧?
这篇文章讨论两个问题:
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给我的人。感谢~~~