中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS汉化世界 & 中文系统 (中文化室) » 显示HZK16点阵汉字信息的VB小程序
English/Chinese Fix Translation
作者:
标题: 显示HZK16点阵汉字信息的VB小程序 上一主题 | 下一主题
fdsiuha
高级用户




积分 587
发帖 302
注册 2005-7-25
状态 离线
『楼 主』:  显示HZK16点阵汉字信息的VB小程序 [已使用 LLM 解释]

前一段时间在论坛上下载了一个显示HZK16点阵汉字信息VB小程序,功能太单一了。考虑到大家还是在WIN下用虚拟机调试汉字系统,所以自己用VB写了一个传上来。

该文件需要和UCDOS原来的HZK16(267,161的那个,其他的HZK16没有试过)或者UCWIN GOLD1.0的HZK16.GBK放在同一个目录下(该文件已经包含在char.rar文件中),如果该目录下同时有这两个文件,那么将使用HZK16.GBK。

WIN98SE的用户需要下载VB RUNTIME DLL文件,该文件打包压缩后有600多K,由于附件大小限制传不上来,下面给个msvbvm60.dll文件的连接,需要的可以在这里下载。2000/XP用户不需要这个文件,因为系统已经自己带了。

http://www.dll-files.com/dllindex/pop.php?msvbvm60

所有缺少的OCX文件都能在下面的网站下载,请按介绍的方法注册组件。

http://www.ascentive.com/support/new/support_dll.phtml?dllname=MSCOMCTL.OCX

---
已经在NT/2000/XP测试,在2000上修正了几个小问题。程序图片见4楼

Last edited by fdsiuha on 2006-4-20 at 00:47 ]


   此帖被 +1 点积分    点击查看详情   
评分人:【 xiaoguizi00 分数: +1  时间:2008-11-15 10:32
LLM 解释

HZK16点阵汉字查看器技术解析

1. HZK16文件格式背景

HZK16是DOS时代UCDOS系统使用的16×16点阵汉字库,采用GB2312编码,每个汉字占用32字节(16行×2字节/行)。UCWIN GOLD1.0的HZK16.GBK则扩展为GBK编码,支持更多汉字(21003个简繁汉字),文件结构与HZK16兼容但容量更大(约267KB×2)。

2. 程序核心功能实现方案

方案A:标准VB文件操作
' 读取GB2312汉字点阵示例代码
Function GetHZK16Data(ByVal HZKFile As String, ByVal ChineseChar As String) As Byte()
    Dim fh As Integer, offset As Long
    Dim区码 As Byte, 位码 As Byte
    Dim buffer(31) As Byte ' 16×16点阵共32字节
    
    ' 获取汉字内码(GB2312)
    区码 = AscB(MidB(ChineseChar, 1, 1)) - &H80
    位码 = AscB(MidB(ChineseChar, 2, 1)) - &H80
    
    ' 计算文件偏移量: (区码-1)*94*32 + (位码-1)*32
    offset = (区码 - 1) * 94 * 32 + (位码 - 1) * 32
    
    fh = FreeFile
    Open HZKFile For Binary As #fh
    Get #fh, offset + 1, buffer ' VB文件操作从1开始计数
    Close #fh
    
    GetHZK16Data = buffer
End Function
方案B:API内存映射(适合大文件如HZK16.GBK)
' 使用CreateFileMapping提升大文件读取效率
Private Declare Function CreateFileMapping Lib "kernel32" Alias "CreateFileMappingA" (ByVal hFile As Long, ByVal lpFileMappingAttributes As Long, ByVal flProtect As Long, ByVal dwMaximumSizeHigh As Long, ByVal dwMaximumSizeLow As Long, ByVal lpName As String) As Long
' 其他相关API声明略...

' 优点:一次映射,多次读取,适合频繁查询场景
' 缺点:需要处理不同Windows版本的兼容性

3. 点阵显示技术

将32字节数据转换为16×16像素矩阵:

' 在PictureBox中绘制点阵
Sub DrawHZK16(ByVal pic As PictureBox, ByVal data() As Byte, Optional ByVal scale As Integer = 4)
    Dim i As Integer, j As Integer, k As Integer
    Dim color As Long
    
    pic.Cls
    pic.ScaleMode = vbPixels
    color = pic.ForeColor
    
    For i = 0 To 15 ' 16行
        For j = 0 To 15 ' 16列
            ' 从字节中提取对应位
            If (data(i) And (128 \ j)) Then ' 高位在前
                ' 绘制放大的像素块
                pic.Line (j * scale, i * scale)-Step(scale - 1, scale - 1), color, BF
            End If
        Next j
    Next i
End Sub

4. 兼容性处理要点

  • Windows版本适配

    • Win98需注册msvbvm60.dll(VB6运行时)和MSCOMCTL.OCX(公共控件)
    • NT/2000/XP内置VB6运行时,但需确保OCX版本兼容
  • 汉字库选择逻辑

' 优先使用GBK字库
Function GetHZKFileName() As String
    If Dir(App.Path & "\HZK16.GBK") <> "" Then
        GetHZKFileName = App.Path & "\HZK16.GBK"
    ElseIf Dir(App.Path & "\HZK16") <> "" Then
        GetHZKFileName = App.Path & "\HZK16"
    Else
        MsgBox "未找到汉字库文件", vbCritical
        GetHZKFileName = ""
    End If
End Function

5. 功能扩展建议

  1. 编码转换:添加Unicode到GBK/GB2312转换功能(使用WideCharToMultiByte API)
  2. 点阵编辑:实现点阵数据修改与导出功能(保存为自定义格式或BMP)
  3. 批量处理:支持文本文件批量转换为点阵图像
  4. 编码查询:显示汉字的GBK/GB2312内码及区位号信息

该程序通过直接解析点阵字库文件,实现了底层汉字显示原理的可视化,对理解DOS时代汉字处理技术具有参考价值。在现代Windows系统中,建议通过内存映射方式优化大文件读取性能,并添加编码自动识别功能提升用户体验。



附件 1: char.rar (2006-4-20 00:46, 429.61 KiB, 下载附件所需积分 1 点 ,下载次数: 1024)


欢迎造访DOS的小屋!
http://risky.ik8.com
2006-1-8 19:34
查看资料  访问主页  发短消息  网志   编辑帖子  回复  引用回复
fdsiuha
高级用户




积分 587
发帖 302
注册 2005-7-25
状态 离线
『第 2 楼』:   [已使用 LLM 解释]

改进后的程序,支持UCWIN GOLD 1.0的16×16GBK字库HZK16.GBK。因为HZK16.GBK兼容性很好,所以默认使用HZK16.GBK文件。下一步改进是能够根据给定的字符串生成相应的小字库文件,并且支持UCDOS和其他最常用的汉字系统的12、14、32点阵字库以及增加字库浏览的功能(差不多像WIN自带的字符映射表)。由于事情众多,预计到20日才能再次更新。

Last edited by fdsiuha on 2006-1-21 at 13:45 ]
LLM 解释

HZK16点阵汉字程序改进方案

一、GBK字库支持实现要点

HZK16.GBK采用GBK编码标准,每个汉字占用32字节(16×16点阵),与传统HZK16的GB2312编码相比:

  • 编码范围扩展至0x8140-0xFEFE
  • 支持21003个汉字及图形符号
  • 保留与GB2312编码的向下兼容

文件定位公式需调整为:

偏移量 = ((区码 - 0x81) * 190 + (位码 - 0x40)) * 32

(区码=汉字内码高字节, 位码=汉字内码低字节)

二、多字库支持架构设计

建议采用模块化设计,抽象字库接口:

' 字库接口定义
Public Function OpenFont(ByVal FileName As String, ByVal FontType As FontTypeEnum) As Boolean
Public Function GetCharData(ByVal CharCode As Long, ByRef Buffer() As Byte) As Boolean
Public Sub CloseFont()

支持的字库类型及参数:

| 字库类型 | 文件名示例 | 点阵尺寸 | 单字字节数 | 编码范围 | |----------|-----------------|----------|------------|------------------| | GBK16 | HZK16.GBK | 16×16 | 32 | GBK(0x8140-0xFEFE)| | GB2312_12 | ASC12, HZK12 | 12×12 | 18 | GB2312(0xA1A1起) | | GB2312_14 | HZK14 | 14×14 | 28 | GB2312 | | GB2312_32 | HZK32 | 32×32 | 128 | GB2312 | | UCDOS16 | HZK16 | 16×16 | 32 | GB2312 |

三、小字库生成功能实现

  1. 功能流程

    • 解析输入字符串获取所有唯一字符
    • 按目标字库格式读取每个字符的点阵数据
    • 生成包含字符表+点阵数据的小字库文件
    • 附加索引表以加速字符查找
  2. 文件格式建议

    [文件头(16字节)]
      标识"MINIFONT" + 版本号 + 点阵尺寸 + 字符数
    [索引表(n×6字节)]
      每个条目: 字符编码(4字节) + 数据偏移(2字节)
    [点阵数据区]
      按索引顺序存储的字符点阵数据
    

四、字符映射表功能设计

  1. 核心功能

    • 按编码区块分页显示字符网格
    • 支持GB2312/GBK编码区间导航
    • 字符预览及编码信息显示(GBK码/Unicode/区位码)
    • 字符选择与复制功能
  2. 性能优化

    • 实现虚拟列表只渲染可见区域字符
    • 缓存已加载的字符点阵数据
    • 使用双缓冲绘制避免闪烁

五、DOS平台兼容性考量

若需在DOS环境运行,需注意:

  • 使用VB 1.0-3.0版本开发以减小内存占用
  • 采用实模式文件访问(INT 13H)处理大文件
  • 限制UI元素复杂度,使用文本模式或VGA图形模式(320×200 256色)

六、开发优先级建议

  1. 完成GBK16字库支持(基础功能)
  2. 实现字符映射表浏览功能(用户交互核心)
  3. 添加GB2312/12/14/32字库支持(扩展兼容性)
  4. 开发小字库生成器(实用工具功能)

此架构设计可确保后续扩展灵活性,同时保持对DOS平台的兼容性。建议采用增量开发模式,每完成一个模块进行独立测试。





欢迎造访DOS的小屋!
http://risky.ik8.com
2006-1-11 21:35
查看资料  访问主页  发短消息  网志   编辑帖子  回复  引用回复
proof
高级用户





积分 687
发帖 222
注册 2005-8-21
状态 离线
『第 3 楼』:   使用 LLM 解释/回答一下

有趣小程序,支持。


2006-1-15 20:04
查看资料  发短消息  网志   编辑帖子  回复  引用回复
fdsiuha
高级用户




积分 587
发帖 302
注册 2005-7-25
状态 离线
『第 4 楼』:   使用 LLM 解释/回答一下

再次更新,如图,文件重新发布在一楼。

用这个更新后的程序浏览HZK16和HZK16.GBK文件后发现确实与WIN的字符映射表中的不完全一样,其中HZK16和HZK16.GBK的0xA2区的字符与WIN下的不完全一样。

Last edited by fdsiuha on 2006-4-20 at 00:50 ]


附件 1: char.png (2006-4-20 00:48, 20.7 KiB, 下载附件所需积分 1 点 ,下载次数: 9)


附件 2: char1.png (2006-4-20 00:48, 23.34 KiB, 下载附件所需积分 1 点 ,下载次数: 8)




欢迎造访DOS的小屋!
http://risky.ik8.com
2006-1-17 17:05
查看资料  访问主页  发短消息  网志   编辑帖子  回复  引用回复
xing7749
高级用户

文盲



积分 833
发帖 349
注册 2004-1-26
状态 离线
『第 5 楼』:   使用 LLM 解释/回答一下

不错,谢谢!


2006-1-18 02:01
查看资料  发短消息  网志   编辑帖子  回复  引用回复
fdsiuha
高级用户




积分 587
发帖 302
注册 2005-7-25
状态 离线
『第 6 楼』:   使用 LLM 解释/回答一下

2000下测试,并修正了两个BUG,对显示字库列表的部分进行了优化(有谁知道如何在VB下将乘法转化成位移的方法,请告诉我。我这一段程序4x循环内中有大量的乘法、除法和取模运算+控件方法调用,运行速度太慢),增加了字库不同区的颜色显示。

再次更新的文件已经上传,但截图由于没有转化为gif或jpg的工具,暂时不更新。

Last edited by fdsiuha on 2006-1-21 at 22:35 ]




欢迎造访DOS的小屋!
http://risky.ik8.com
2006-1-21 13:36
查看资料  访问主页  发短消息  网志   编辑帖子  回复  引用回复
secowu
初级用户





积分 201
发帖 92
注册 2005-12-28
状态 离线
『第 7 楼』:   使用 LLM 解释/回答一下

不知道怎么用


2006-3-7 15:34
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
g00000
新手上路





积分 2
发帖 1
注册 2006-3-23
状态 离线
『第 8 楼』:   使用 LLM 解释/回答一下

不错!!!


2006-3-23 15:14
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
fdsiuha
高级用户




积分 587
发帖 302
注册 2005-7-25
状态 离线
『第 9 楼』:   使用 LLM 解释/回答一下

Originally posted by secowu at 2006-3-7 15:34:
不知道怎么用

晕哎...

由于电脑坏了有一段时间了,所以现在没有办法再添加更多的功能,只能过一段时间再看了。
再次修正了几个BUG,新文件已经上传,下载请到一楼。程序的图片也已经更新。

另外说明一下:如果选择自己打开文件的话,只能支持HZK16的GB2312而不是HZK16.GBK,即使打开的文件是HZK16。想使用GBK的话,请把HZK16.GBK文件放在同一个文件夹里,并重新打开程序。

PS:发现HZK16和HZK16.GBK在文件的F8和F9区添加了好多LJ字符啊...这些字符看起来实在很衰...另外最后一个区的字符一样LJ居然WIN下也有对应的字符...狂晕..

Last edited by fdsiuha on 2006-3-30 at 14:25 ]




欢迎造访DOS的小屋!
http://risky.ik8.com
2006-3-30 14:05
查看资料  访问主页  发短消息  网志   编辑帖子  回复  引用回复
ppshow
初级用户





积分 128
发帖 47
注册 2005-11-19
状态 离线
『第 10 楼』:   使用 LLM 解释/回答一下

支持,希望能够支持更高点阵的字库显示。~~~期待楼主更新~~~

Last edited by ppshow on 2006-6-4 at 19:24 ]


2006-6-4 04:30
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
fdsiuha
高级用户




积分 587
发帖 302
注册 2005-7-25
状态 离线
『第 11 楼』:   使用 LLM 解释/回答一下

实际上所有的字库格式基本一样,算是“没有”格式的文件(点阵字库没有压缩的必要,当然,这也给识别一个文件究竟是不是字库文件出了点难题),比如12点的字库,或者简直bootfont.bin文件,都可以用这个软件打开浏览--当然显示会有点问题--看到里面的内容,最近一段没有时间修改,这个程序实际只要稍微修改一点点数据就可以了,但是由于上面说的不好识别文件格式,所以会给实际应用带来一点麻烦,不过我在考虑是不是不自动识别,而是靠程序使用的人自己选择?

有谁有判断字库点阵大小格式的好方法,请告诉我啊~




欢迎造访DOS的小屋!
http://risky.ik8.com
2006-6-21 23:19
查看资料  访问主页  发短消息  网志   编辑帖子  回复  引用回复
marcoak
初级用户





积分 42
发帖 22
注册 2005-10-16
状态 离线
『第 12 楼』:   使用 LLM 解释/回答一下

VB所有运算符参见:
http://msdn2.microsoft.com/zh-cn/library/f15ea9k8.aspx


2006-6-26 22:14
查看资料  发短消息  网志   编辑帖子  回复  引用回复
fdsiuha
高级用户




积分 587
发帖 302
注册 2005-7-25
状态 离线
『第 13 楼』:   使用 LLM 解释/回答一下

那是VB2005的,我还在用VB6.0




欢迎造访DOS的小屋!
http://risky.ik8.com
2006-6-28 22:28
查看资料  访问主页  发短消息  网志   编辑帖子  回复  引用回复
marcoak
初级用户





积分 42
发帖 22
注册 2005-10-16
状态 离线
『第 14 楼』:   使用 LLM 解释/回答一下

C++都有.VB6.0根本没有.你只能用AND和OR加上字节型自己写一个. 节哀吧.


2006-6-29 00:58
查看资料  发短消息  网志   编辑帖子  回复  引用回复
zyl910
中级用户





积分 282
发帖 126
注册 2006-5-17
状态 离线
『第 15 楼』:   使用 LLM 解释/回答一下

在VB5、VB6选上高级优化编译exe时
对整数“* 2”、“\ 2” 这样的操作会编译成移位,速度非常快

“mod 2”之类的代码可以换成用“and”,这样避免了除法
比如:“x mod 256”(十六进制:x mod &H100)可以化成“x and 255”(十六进制:x and &HFF)


以前曾经答应别人写篇关于VB位运算的文章的,但是人懒。
这是我以前写的VB位运算模块,慢慢参悟吧:
http://blog.csdn.net/zyl910/archive/2006/05/24/752113.aspx


其实做好程序优化,VB程序速度不会慢的。即使是像GIF、JPEG编码这样需要大量的位运算的领域:
http://blog.csdn.net/zyl910/archive/2006/05/29/762401.aspx




人类存在的目的就是试图理解人类为何存在
2006-6-29 14:10
查看资料  发送邮件  访问主页  发短消息  网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: