完成了S60一个无聊的程序,感觉时间都浪费了,不过还是有所收获的。

完成了一个类似于记事本的一个东西,可读取文本文件,但是是只读的,做这个的初衷其实是为了不用sdk的api来转换直接在程序中写中文,现在想来其实是多此一举,我搞的这个还是要进行编码转换,而且效率可能还不如用api,也不如在rss里写方便。最后搞来搞去,搞成了一个文本阅读器,可读gbk,unicode,unicode big endian和UTF-8,基本和记事本没什么两样,除了只读和界面以外。

中间让我感到最浪费时间的就是搞了个中文的字体位图,为了和系统字体区别,选了幼圆的字体,结果发现除了宋体以外,其他的字体在16px大小下显示情况都不尽如人意,也就是幼圆看起来还可以,要是用12px的话就更没法看了,怪不得要把宋体作为系统的标准字体啊。字体位图使用了单色的位图,包含了ascii,常用标点,和5M的CJK基本字符,后来又发现还有1.5M的CJK扩展字符,还有gb18030中的扩展,太多了,实在是不想再加进去了,太麻烦了。在实际读文件时又发现没有引号和省略号,查了字符表才看见是在另一个地方,真是很郁闷,为什么unicode把这些符号不放在一起呢,只好加上,又把希腊文也加了进去。本来想使用GBK的码表来放字符顺序,后来为了和系统保持一致使用了unicode码表。其实是因为GBK码表中汉字是分段存放的,而在unicode中是连续的,为了方便只好采用unicode。(我哭啊,本来是想用GBK码表,不用转换直接在程序中写中文的,现在用了unicode,这个系统自带的有啥区别啊,写GBK时还得转换,时间都浪费完了)使用了unicode最大的一个问题就是要自己转换的话必须用gbk-unicode的映射表,没想到这个表都这么难找,虽然在网上搜到了很多贴,但是都是说点“这里”下载,而“这里”根本没有链接,只好到unicode的官方网站上去找,历尽千辛万苦终于被我给找到了,http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP936.TXT

虽然浪费了很多时间,但也不是没有收获,就是对unicode更加熟悉了,也对UTF-8的了解加深了。因为UTF-8不是强制加BOM来于其他编码区分的,所以读取时除了看有没有BOM外,还要看字符是不是符合UTF-8的编码规则,做这个时让我发现了windows记事本的一个缺陷。我们知道即使没有BOM,windows记事本也是可以识别UTF-8的,经过我的观察它是把所有的字符都扫描一遍看是不是每个字节最高位为1的都符合UTF-8的编码规则,如果是的话就认为是UTF-8,不是就认为是ANSI/GBK,但其实这样还是会出现问题,比如输入“姹夋眽”,存成ANSI,再打开记事本会认成“汉汉”,而且认为是UTF-8的,类似的还有很多。流传最广的是就是输入“联通”保存,再打开会出现黑框,还说是微软和联通有仇,其实根本八竿子打不着,真正原因是因为“联通”的编码符合UTF-8的编码规则,C1 AA CD A8,换成2进制是11000001 10101010 11001101 10101000,正好可以套用UTF-8到unicode的公式,变成00 6A 03 68,从这里就可以看出记事本的缺陷了,就是第一个字符“联”被认成了00 6A,这个是子母j,但这不对的,因为这个高位为0,不应该套用公式,因为为了兼容ascii,只有高位为1的才用公式转换,所以应该是第一个字节大于11000010才能认为是UTF-8,所以记事本没有显示这个字符,但是我认为记事本根本就不应该把这个文档认为是UTF-8编码的,看来windows记事本这里不够严谨,相比之下UE就不会出这样的错。我为了方便没有像记事本那样扫描整个文档,而是只扫描前5个高位为1的字符,如果都符合就认为是UTF-8的编码,否则就认为是ANSI/GBK,这样能快一些。

然后就是输出字符到屏幕上,控制翻页等等,也遇到了很多问题,最主要的就是因为采用了单色位图,所以获得象素点的值得用移位,而我在控制翻页时又考虑是一下载入整个文档,还是只载入开头,翻页时再载入后面的,实际试验中发现,如果使用第2种方法会没法确定行数和页数,而且向前翻页时会像SymbianEdit的例子那样,没有遇到回车换行符时无法确定段落的位置,所以采用了第一种方法,只是全部载入会花点时间,为了能快一些我把整个文本都载入到一个单色位图中,这样就又涉及到两个单色位图之间贴图都要进行移位与、或,所以就出现了当字符输出位置不是16的整数倍的时候,会只打出半个字符,查这个BUG可费了老劲了。有人说咋不用SDK自带的函数呢,我现在想想也是,真是自找麻烦啊。不过这到让我练了自定义贴图函数的设计,可支持各种深度的颜色相互贴图。

浪费了很多时间,终于完成了这个程序。虽然很无聊,但还是让我学到了很多东西。总之就是每次编程多多少少总会有收获,不管程序有多无聊,我现在还是庆幸我把它完成了,因为以后再让我搞类似的东西可能我都没有这个耐心,尤其是创建汉字的位图,在这里佩服一下那些从事字符编码和字体设计的人,浮躁的人容易半途而废,我不要做浮躁的人,所以这个程序虽然很无聊,但我还是完成了。希望我对编程的热情能一直保持下去。 

©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值