|
本帖最后由 dos时代菜鸟 于 2014-3-31 07:36 编辑
DOS下显示汉字似乎不简单,下面是我的理解,如有偏差,请大侠们指正。
对应于英文,ASCII 0-127 数值的ascii码,汉字成千上万。用0-127 可以表示大小写英文、数字、小数点和键盘按钮,而中文怎么表示呢?前辈们想到了一个方法:
就是用两个数值大于127的ascii 联合起来表示一个汉字,有点像四角号码字典查字法。0-127西文字符 占用1个字符 8位二进制位置,而实际上 0-127 的西文字符只占用 7位二进制。用两个占位8位的ascii字符表示一个汉字(有人叫做高站位H),就可以避开0-127 ,避免与西文字符冲突。这就需要 这两个表示汉字的ascii数值必须大于160,而可识别西文ascii最大255,所以表示汉字的两个ascii字符的值就是161-255之间。如此组合应该可以组合成不到一万个汉字,这足够日常使用了,而事实上我们的常用汉字系统hzk16字库中有效汉字为6768个。不信你在运行了ucdos后,在dos下用alt+(161-255)的方法随意输入两个ascii字符,肯定能呈现出一个汉字,当然如果hzk16字库中没有这个组合,就不好说了。
如果在c语言中用 unsigned 定义这两个字符,肯定大于255,所以,如果在dos下遇到两个这样的字符组合其值大于255,那可以判定为汉字,而单个出现的161-255间的ascii码其数值一定在161-255间是小于256的。当然这个判断也不一定准,因为人家可能就是两个161-255间的ascii码(比如音标和制表符),而非汉字,但这个情况太少了,我想这也是为啥有的汉字系统不能显示西文制表符表格的原因。
Hzk16字库的结构:
首先hzk16是二进制文件。每一个汉字占用32个字节(16*16点阵,每行二进制2个占8位的数字存放,共16行,所以32个字节,每行16位,每位非0即1,如此就用‘1’勾勒出一个汉字的轮廓。),显示出来占用两个字符的显示位,也就是两个西文字符的位置。前面说了用两个数值在161-255间的ascii码表示一个汉字,那么,如何确定任意组合对应的汉字呢。Hzk16中有94个区,每个区有94个汉字或图形符号,其中16-87区是汉字,1-9区是符号,10-15及88区以后是空留的。那么那两个表示汉字的ascii码字符,与这又是什么关系呢?第一个ascii码字符的数值减160就是所表示汉字的区号,而第二个ascii码字符的数值减160就是所表示汉字的位号,如“啊”,可以用 Alt+161,Alt+176这两个ascii字符表示,即ascii码数值为161和176的两个ascii码字符表示,“啊”字的区码是1,位码是16,如果在ucdos 的区位输入法中输入 1601 ,就能得到 “啊”字了。如果用c语言 fopen(”hzk16”,”rb”) 方式打开,读取这个字的位置应该是((区码-1)*94+位码-1)*32=480,c语言可以通过fread 方式读取hzk16的480位置处的32个字节信息传递个数组,数组中只包含0或者1,0表示改点无内容,1表示改点有内容,然后通过画图画点函数在图形模式下画出图像就是“啊”字。
|
|