2013年6月28日 alex

在点阵lcd上显示上位机点阵字模库中的汉字字符

我在2006年开发usb电话的时候,需要将上位机的点阵字库中的汉字显示到电话机的屏幕上,本文略去usb传送汉字编码,显示控制等数据的自定协议不谈,仅说明一下一些常见的字符编码转换.
我需要做的一个工作是: 用字模软件提取一个gb2312字符点阵集,将windows程序中字符串使用的汉字从点阵集中找出来,把点阵数据送到单片机以显示.
我们用VC6编写的应用程序中使用的汉字字符串(比如使用一个lpstr),在编译后以机器内码的形式保存在应用程序中.我们需要将机器内码转换成汉字在字模软件提取的gb2312点阵集中的位置.
首先需要将机器内码转换成区位码,这一步只需要把机器内码的高低字节分别减去0xa0即可.然后我们需要通过得到的区位码,找到对应汉字在gb2312字符点阵集中的位置.
假设每个字符点阵汉字都是16×16大小的,一个汉字站用32字节.设我们得到的区位码为AB,A为高字节,B为低字节,则我们需要的”对应汉字在gb2312字符点阵集中的位置”(即对应的汉字点阵数据开头离整个字符点阵集开头的字节数,下文简称”偏移码”),根据gb2312和区位码的编码规则,可以通过如下计算获得:
 [(A-1)x94+(B-1)]x32
=[Ax94-94+B-1]<<5
=(Ax94+B-95)<<5 …①
根据以上的论述,可以得到VC6中汉字字符在内存中使用的机器内码直接转换成字模偏移码的算法:
设机器内码位CD,C为高字节,D为低字节.
有 A+0xa0=C, B+0xa0=D.
代入①得:
 [(C-160)x94+(D-160)-95]<<5
整理出最快式得:
 (Cx94+D-15295)<<5 …②
由②知:
 对应汉字在gb2312字符点阵集中的位置=(机内码高字节x95+机内码低字节-15295)<<5;
其他可能需要的是一些windows api可以直接提供的转换,还有就是简单的三字节utf-8与unicode的转换等,只需要简单的移位或加减操作即可完成.
在usb电话上显示出好看的楷体和宋体汉字字符后,喝了口茶,感觉很不错~