建议采用大头(Big-Endian)方式。
也就是说,ZB码是常用二字节的8192位其他字符+GB2313的顺序编码
四、设计思路
4.1 图形显示
图形显示采用了虚拟显存技术,定义一个二维数组作为显存,程序通过修改显存达到改变显示的目的,设置定时器通过二维数组以一定频率刷新前端,模拟显示器的电子枪。
这样设计,虽然会使程序占用一些CPU资源,但是可以方便地设计出更多的动画。
4.2 光标显示
在文本编辑器中,光标会以一定频率闪烁来提醒编辑者正在编辑的位置。在本程序中,由于采用了模拟显存与显示器的设计,只需要设计另外一个定时器计数,当计数的值小于某个值时将光标写入显存,大于某个值时不写入显存,超过某个值时,将计数器清零,这样就达到了使得光标在任意位置闪烁的目的。
4.3 光标编辑
文本编辑器中,光标的另一个作用是要在光标对应的位置添加或删除一些字符,在本程序中,通过模拟内存完成,定义一个字符数组表示内存,光标的变化对应着字符数组指针的变化,这样就达到了光标编辑的目的。
4.4 换行
在图形模式下实现文本编辑器的一大难题就是换行的处理,因为换行后光标的位置会有很多变化形式,而光标对应内存中的指针却不会发生特殊变化,这种变化的不一致性造成了编程的复杂。这里就更进一步体现了模拟显存设计的优越性,可以修改译码程序,在对'\n'操作时,将光标下移至下一行行首,这里又涉及到了换页的问题。
4.5 翻页
翻页是通过检测光标的位置是否超过了屏幕的边界实现的,当光标位置超过屏幕边界时,需要将内存指针移动一行的位置,将光标移动回上一行。但这里事实上实现起来是很困难的,原因是内存指针并不知道移动多少才是一行,因为换行符表示的字符是不固定的。这里采用的是重新计算光标位置的方法,也就是说每移动一次内存指针,对光标的位置从屏幕开始进行一次重新计算,也就是说逆向难,就正向重做的思想。
4.6 保存
文本编辑器通过都具有保存文件和打开文件两种功能,而ZB记事本又不同于一般的文本编辑器,额外具有GB和ZB的转码功能。也就是说,我们需要制作四个功能,分别是哲标打开,哲标保存,国标打开,国标保存。这里的思路是首先选定一种2码作为主码,也就是在内存中永远以主码存储,在导入导出中,发生转码操作。
五、关键技术
5.1 虚拟显存
虚拟显存是本编辑器最重要的技术,由于不能调用系统级API完成显示,所以大部分的实现都要自己来完成,比如光标显示、字符输出等,这些都依赖于模拟硬件实现的显存机制。
5.2 跨平台图形模式
哲标记事本使用QT开发,QT是一个跨平台C++图形框架,也就是说该记事本能在全平台编译使用
5.3 ZB码
ZB码是浙江大学楼学庆教授开发的新编码手段,以16位为一字节(zjie)取代8位字节(byte),达到了统一中英文的目的。
六、使用方法
6.1 编译方法
本程序需在QT5.0以上版本编译,建议使用QT Creator进入项目后直接构建
6.2 使用方法
程序的输入法在最下面一栏,进入程序后默认是汉字模式,通过输入拼音,在候选栏中通过输入数字来选择需要的字,+-用来切换候选字列表。
Caps Lock 用于切换大小写
Shift 用于切换中英文
ctrl + ,/./!用于打印标点符号
菜单栏File用于保存/打开文件
上下左右方向键移动光标
七、运行情况
下面的测试是基于macOS进行的,windows也类似,不过背景颜色不一样。
7.1 初始界面
7.2 拼音输入法
输入拼音
+号向下翻页
-号向上翻页
通过数字选择汉字
如果拼音输入错误
可以删除重新输入
效果就是这样
7.3 编辑功能
输入四个汉字
支持多种字符
7.4 光标编辑功能
上移光标
左移光标
可以通过光标在任意位置编辑
7.5 自动翻页
我们任意编辑,当超过一页的大小时就会自动翻页
通过移动光标,就能向上翻页
注意这里拼音输入法是支持模糊搜索的
所以达到了任意位置,任意编辑的效果
7.6 ZB与GB的文件操作
首先将刚刚编辑好的内容以ZB码存文件
然后关闭程序,以ZB方式打开刚刚存好的文件
我们发现内容是一致的
接下来以GB方式存文件
再以GB方式打开
内容也是一致的
下一页的内容也没有丢失
这是菜单栏的样子
八、总结展望
ZB记事本通过使用ZB码和ZB字库输出点阵汉字,而完成一个比较完善的程序,需要的工作量还是挺大的。在这个大程中,体会最深的就是计算机底层知识的重要性。假如我没有修过计原,我就不会知道显示的原理,本程序使用的虚拟显存这一关键技术也就不会被想到,而且码的译码和转换也与课程紧密相连了。
这学期的计原就要结束了,给我最大的收获就是计算机底层的理解,其次是C语言位运算和一些底层操作的更加熟练的掌握,还有一些大型项目的编程经验。
希望以后能多修一些底层的课,来掌握更多原理性的知识。