这个从用上zip解压的版本到现在出现的bug,现在终于修复了。
解压代码整个改掉,花了5天时间进行修复,从zip解压改成tar解压,测试后正常。utf-8大法好。
v24.1顺便也修复了1个bug (也就是名字询问框按enter没反应的问题)
md累死了累死了
乱码的原因
这个Bug是从v23.1就开始有的。自从用上zip来进行解压伪文件系统后,就出现乱码了
原因在于zip格式没有任何文件名编码格式,有些软件可能会用gbk编码文件名,有些可能用的是ascii,有的是mbcs,没有统一的标准。Python的ZipFile库是用CP437 (又称MS-DOS Latin US)。
网络上有些“解决方案”,实际上也就是把zip里面的文件名拿出来,用cp437编码,最终用gbk解码,然后使用zipfile.read()把zip里面的特定文件内容读出来写进新文件。只可惜,Ren'Py并不支持cp437编码,我是完全不知道为什么,甚至连gbk都不支持... 只支持utf-8解码和mbcs解码 (在安卓上,甚至连mbcs都不支持),所以我也没办法了。
看了看Python的标准库还支持什么压缩文件... 我忽然想到了Tar,Python标准库支持。Bingo!
tar虽然也没有文件名编码规范,不过确实之后有了个新标准,有定义tar文件需要使用utf-8来给文件名编码。
那么,把解压代码写进游戏脚本,给几个参数,然后一切非常简单的解决了吗?
不可能,不可能,事情没有想象中的那么简单。Tarfile这个库默认会用sys.getfilesystemencoding()返回的编码来解码Tar文件,而我们的tar文件是用utf-8编码的,这个会造成一些问题。更惨的是,设置了Encoding参数,Tarfile把这个参数直接忽略了... 斯... 说成忽略了好像也不对,貌似还是有点效果的,不过解压到某个文件,突然没法解压,然后跳入崩溃界面。
然后我再想了想... 我想到了可以把解决zip文件名乱码的骚招拿来改一改,然后我改了,然后就遇到了新问题。
tarfile.getnames()会给你返回一个列表,里面列着tar文件里的所有文件的文件名和路径
问题来了:这个列表是和目录混杂在一起的,比如我有个目录叫做 “api/”,当放入解压代码时,Tarfile会把这个目录当做文件来读 (因为tarfile.getnames()会返回"api"而不是"api/",这个导致我没法使用endswith()函数来确认这个是不是一个目录)。
后来我绝望了一下。然后去看了看Tarfile的文档,看到了一个宝物,TarInfo。
TarInfo是一个调用tarfile.getmember(), tarfile.getmembers, tarfile.gettarinfo()函数后返回的一个对象。
这个对象(作为一个Python学生,说是对象... 也感觉像是个Class吧...),有个对我来说非常重要的函数:tarinfo.isdir()。
顾名思义,这个函数做的就是,你通过getmember()返回的对象,是个目录还是个文件。
这个对我来说,是个救命恩人吧... 我把isdir()放入游戏脚本,加几个if条件,果然,成功,然后我再把zip乱码超级骚的解决方案拿来改了改,试了几次 (花了好几个小时,我感觉我像疯狂的科学家一样...),终于成功了,放在Android上面,也成功了。
然后,爽翻天了。看起来没有需要添加新功能了,现在的剧本也没有更多新东西了,摸鱼咯!





5天的时间修复这个该死的bug啊,五天啊!摸鱼摸鱼,测试什么的 我只负责Alpha测试,Beta测试甩给别人!
