# 认知码码表及其导出过程
** 认知码码表及其导出过程 **
## 引言
[上一篇文章](../SUBOR4_learnRZM_CrosswordPuzzle_clearanceAnswer/detail.html "【小霸王学习卡 V4.0】认知码学习-填字游戏【通关记录】") 说到,通关《认知码学习-填字游戏》的时候,有些不会打的字查的码表,于是,就有人问我要认知码输入法的码表。事实上,我在那个时候确实还没有完整的认知码码表,但是就认知码的码表来说,全网还真是找不到一点资源,我想了想,我不来搞这个码表,谁来搞?于是我又花了一个星期的时间,终于把认知码的单字的码表彻底完整的搞出来了!在此,实名感谢软驱一号群的群主__VB步步高__大佬。
## 目录
[TOC]
## 导出过程
### 开端
故事还是有点曲折的,待我慢慢道来。
事实上,我对认知码的码表还是很感兴趣的,就是因为我曾经接触过,并且网上还真没又资源,再加上对于《填字游戏》的执念。但事实上,我对认知码及其码表本身并不感兴趣,我也只是对提取过程感兴趣,既然网上没有,我又做到了,这比较有成就感。我在网上搜的对于认知码输入法的提问,回答的最多的还是软驱一号群的群主VB步步高的答案,也就是软驱一号虚拟机WPS存盘法,但是这个方法毕竟不是那么令人不愉快的。于是我咨询了VB步步高大佬,他给出了一个可行的思路:那就是从软驱一号软盘镜像中的rzm.exc文件中提取。rzm.exc文件是软驱一号的bbgcdos系统(步步高的中文dos系统)中的一个认知码输入法的加载程序。之前我曾经也想过从小霸王学习卡或者其他学习卡的nes文件中提取认知码的码表,但是可惜我对6502汇编了解几乎为0,根本弄不懂它们存在什么地方,所以,很多次打开看了看之后,只能放弃了……
我用文本的方式打开rzm.exec文件一看,哇塞,那码表不整整齐齐摆在眼前嘛!
用文本方式打开rzm.exc文件截图:
![rzm.exc部分](rzm_exc_part.png "rzm.exc部分")
但是我也是一时被喜悦冲昏了头脑,我早该想到,想要搞到完整的认知码码表从来不会这么简单。
看这里面有一些乱码!就是这些乱码,让我好几晚上都睡不着觉。
其实,把rzm.exc里面这一部分截出来之后,大体上对于每个字的码能猜出个大概,虽然有点费事,所以,[上一篇文章](SUBOR4_learnRZM_CrosswordPuzzle_clearanceAnswer "【小霸王学习卡 V4.0】认知码学习-填字游戏【通关记录】") 所说的码表,其实就是靠这个东西,连蒙带猜的结果,而真正的码表那个时候并没有。
根据明码显示的东西,我大体猜出了它的排列规则:它是以反斜杠"\"作为分割,每一段的前两个码是相同的,是以1-9a-z顺序排列的,问题是并不是所有情况的前两个码都有相应的段,也就是说,有些两码排列方式是空缺的。
### 发展
我对这里面的乱码有一个大体的猜测和认识:大部分是1、6、7、8、9这几个数字码用了另一个字符代替。
大体的对应关系如下
```
0xb1 1
0xb6 6
0xb7 7
0xb8 8
0xb9 9
```
对应关系既然这么明确,转换应该也不难吧?
但事实上没这么简单:因为这几个字符也是组成汉字的重要组成部分,会在汉字的两个字节中的任意字节出现。
偏偏就我大体观察的码与汉字的对应关系是不规则的,但是这种不规则会导致汉字识别上是错位的。
这个问题让我很头疼,因为如果码和汉字一直触碰这5个特殊字符,我是没办法区分哪些是码哪些是汉字的。
就这样陷入了僵局,我甚至用我仅有的那点编译原理的知识去分析各种排列组合的识别方式,结论是,搞不出来……
### 高潮
就这样僵持了几天之后,我放弃了,我觉得既然理论上没有可行性,那么在转换这几个字符时一定用了额外的信息。
但是我看着rzm.exc的一堆乱码陷入了绝望。我决定不管怎么搞,先写个转换程序再说:我先假设遇见特殊字符的时候,总是假设这个汉字前面有两个码。调了一会儿的bug之后,这个转换程序终于正常执行了,结果转换后的结果不禁让我叫出了声:非常规范!非常整齐!
当我看着转换后的结果再去理解排列方式的时候,我明白了,其实它原始的排列就是规则且整齐的,而我之所以得出了不规则的结论,是因为受到了乱码的影响,做出了错误的判断。
rzm.exc正确转换后的结果:
![rzm.exc转换后](rzm_exc_parse.png "rzm.exc转换后")
乱码问题解决之后,剩下的问题就是对应每一段的前两码到底是什么。人工去识别太费功夫了,有八百六十多段呢。于是我就想了个虽然很迂回,也比较慢,但是好歹还好用的办法。我下载了按键精灵,然后写了一小段程序,遍历所有两码情况,然后输出到软驱一号虚拟机的WPS程序中,让它以定义好的格式输出一个二级简码的码表,然后存盘、导出。结果如下。
![二级简码的码表遍历结果](two_level_visit.png "二级简码的码表遍历结果")
我又写了一些小程序,过滤出空码和词语,保留正常的。认知码输入法有个很奇怪的设定,那就是如果一个码存在词语,那么词语首先排在前面,我觉得这个设定就很坑,词语优先输入要二级简码干啥。对过滤出的词语,我又重新修改按键精灵脚本,又遍历了它们的第二候选字,依然有些是词语的,但是只剩十几个了,我就手动录入了。之后跟原来就正常的合并,形成总的。之后,根据rzm.exc正确转换后的结果的每行首汉字进行匹配排序添加前两个码。由于有些字有两个码,导致第一个码被覆盖了,所以其中还是有些错误,还有些非二级简码的空缺,想了一些办法,有的人肉修正,有的写了程序去填补,总之,由于种种原因,我得到的**码表可能还是存在某些错误的,希望大家注意并及时提交问题,以便及时修正**。
### 结局
最后,再手动添加一级简码的部分,整个完整的码表就完成了。
rzm.exc导出码表最终效果:
![码表最终效果图](rzm_code_table_final.png "码表最终效果图")
最后的最后,我还写了一些转换小程序,把码表排列成各种的格式,方便大家使用。
## 码表下载链接
[rzm.exc内部格式的认知码码表](rzm_code_table_rzm_exc_format_20211225.txt "rzm.exc内部格式的认知码码表")
[GB2312区位码排列的认知码码表](rzm_code_table_gb2312_sort.txt "GB2312区位码排列的认知码码表")
[根据码序排列的认知码码表](rzm_code_table_code_sort.txt "根据码序排列的认知码码表")
[小狼毫(RIME)格式排列的认知码码表](rzm_code_table_rime_format.txt "小狼毫(RIME)格式排列的认知码码表")
__注:其中的字频来自小狼毫的五笔输入法,根据汉字匹配的结果__
花楹 于
2024-7-12 07:52:58 说:
@SF-Human [握手]
SF-Human 于
2024-6-07 17:08:17 说:
辛苦了,最近刚好对认知码比较感兴趣,来学习一下