无忧启动论坛

标题: dos下汉字那点儿事儿(个人理解) [打印本页]

作者: dos时代菜鸟    时间: 2014-1-28 12:32
标题: dos下汉字那点儿事儿(个人理解)
本帖最后由 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表示改点有内容,然后通过画图画点函数在图形模式下画出图像就是“啊”字。

作者: renchmin    时间: 2014-1-28 14:13
原来DOS下面显示汉字确实是很不容易的,现在才知道。
作者: Mindfly    时间: 2014-1-28 18:03
学习学习,长知识了,当年学的UCDOS
作者: asqw101451    时间: 2014-1-28 19:41
dos版块很冷清,进来支持一下。现在用Dos的很少了吧,我在Dos下也只用Dg和Ghost
作者: 2012danfong    时间: 2014-1-29 11:14
原来如此,长知识了。
作者: 穿云鹤    时间: 2014-1-31 05:53
来给大侠捧场。
作者: jh1688    时间: 2014-1-31 10:27
虽然早已了解,还是要谢谢分享……
作者: 2012qixitianlon    时间: 2014-2-2 01:14
长见识谢谢楼主的细心指导
作者: fyqingshan    时间: 2014-2-3 19:20
学习了,涨见识了

作者: cht501155    时间: 2014-2-20 14:43
DOS下面显示汉字确实是很不容易的
作者: pseudo    时间: 2014-2-20 14:52
文本模式下显示汉字也是DOS时代好玩的方式。

作者: jie_china    时间: 2014-2-20 22:23
原来如此,长知识了。
作者: zmxaaa    时间: 2014-2-21 20:26
DOS界面为什么不搞中文版面原因困难重重。
作者: dos时代菜鸟    时间: 2014-2-27 08:01
pseudo 发表于 2014-2-20 14:52
文本模式下显示汉字也是DOS时代好玩的方式。

是说用 ascii 128-255 来显示汉字么?同屏幕可显示 64个汉字。
作者: czswuyou    时间: 2014-2-27 10:04
学习了,支持一下。
作者: day52    时间: 2014-3-6 22:45
提示: 作者被禁止或删除 内容自动屏蔽
作者: 皓轩你好    时间: 2014-3-12 11:06
挺不错的啊,分析的很好
作者: qxhdly    时间: 2014-3-16 05:18
学习学习,长知识了
作者: 滑头    时间: 2014-4-27 01:01
本帖最后由 滑头 于 2014-4-27 01:03 编辑

这里说的不就是中文内码吗?没有说出什么“不容易”来呀!
DOS下的中文系统有个发展过程,但每个中文系统都要是各自的显示点阵字库(16x16),没有统一的规格。为显示这些点阵还要有针对不同显示卡和显示方式的驱动程序。实现了显示的直接写屏以后才实现了屏幕上的文字复制。UCDOS是个钻空子走关系的系统,直接写屏的中文显示有很严重的表格识别错误,但被捧得很高。后来不得不把中国龙汉字系统的表格识别搬来纠正,那已经是WIN95开始风行的时候了。DOS下真正实用的还就是常见的天汇汉字。
DOS下中文系统打印比显示更不容易,同样要有针对不同打印机的驱动,同时还要另外配备字库。开始也是点阵,24x24和48x48,直到求泊君的WPS才在打印中用上了中文的矢量字库。
作者: we180900    时间: 2014-4-27 08:21
原来如此,学习了,谢谢楼主
作者: dos时代菜鸟    时间: 2014-4-29 12:44
滑头 发表于 2014-4-27 01:01
这里说的不就是中文内码吗?没有说出什么“不容易”来呀!
DOS下的中文系统有个发展过程,但每个中文系统 ...

我用ucdos 是因为 他的驱动兼容性强,尤其是ucmouse 可以和ctmouse  配合。而tw ccdos 等似乎都和 ctmouse 有冲突。
作者: 滑头    时间: 2014-5-1 23:41
DOS时代喜欢用哪个中文系统是个人的事情。但我还是想告诉你,UCDOS的广告把国家统计局放入,公开违法。广告法不允许广告中有国家机关名称,但国家统计局的违法就没人敢追究,让人想起***时代的中统和军统。这就是九十年代最丑陋的一次*。
作者: 20101    时间: 2014-5-3 20:11
学习了,很长见识。
作者: dgrand    时间: 2014-7-21 08:39
真的让人很怀旧。




欢迎光临 无忧启动论坛 (http://bbs.wuyou.net/) Powered by Discuz! X3.3