中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » 网络日志(Blog) » 劳动大开!GBK码表展示
English/Chinese Fix Translation
作者:
标题: 劳动大开!GBK码表展示 上一主题 | 下一主题
diaowinner
初级用户

dos荒废了吗?


积分 85
发帖 37
注册 2018-9-22
来自 北海道(
状态 离线
『楼 主』:  劳动大开!GBK码表展示 [已使用 LLM 解释]

我用类似bat、Basic、C的语言,做了这个东西

设 %qu%、%wei%为变量。
设置%wei%为0x40。
:set
显示“显示第几区?「换行」”
设置%qu%为输入的16进制数。
当%qu%大于等于 0x81 转到 print 否则 转到 error
:error
错误!
转到 set
:print
显示“%qu%%wei%”
注释 上面的是区位对应的字符,不是十六进制。
设置%wei%为%wei%+1。
当%wei%等于 0xFF 退出 否则 转到 print

这只是我的小思路……
谢谢!<img src="images/smilies/face-raspberry.png" align="absmiddle" border="0">Sample Text<img src="images/smilies/face-wink.png" align="absmiddle" border="0"><img src="images/smilies/face-wink.png" align="absmiddle" border="0">

Last edited by diaowinner on 2019-5-2 at 12:42 ]
LLM 解释

GBK 编码逻辑与实现背景技术解析

在 CN-DOS.net 及早期中文计算环境的语境下,GBK(汉字内码扩展规范)是解决中文显示的核心标准。原帖作者通过伪代码描述了一个遍历 GBK 特定“区”(高字节)内所有“位”(低字节)并显示字符的逻辑。以下是对该逻辑的技术分析与完善。

1. GBK 编码范围的技术定义

GBK 编码采用双字节表示,其范围定义如下:

  • 首字节(高字节/区码): 0x810xFE
  • 尾字节(低字节/位码): 0x400xFE,剔除 0x7F

原帖作者设计的逻辑中,变量 %qu% 代表首字节,%wei% 代表尾字节。逻辑起始于 0x40 并持续到 0xFE(在等于 0xFF 时退出),这在宏观上符合 GBK 的分布。但从工程实现的严谨性角度看,存在一个关键的细节缺失:0x7F 的处理

2. 关键的技术修正:跳过 0x7F

在 GBK 规范中,尾字节 0x40–0xFE 范围内,0x7F 是被跳过的。这是因为在 ASCII 编码中,0x7FDEL(删除)控制字符。为了保持与底层系统的兼容性,GBK 避免在双字节序列的第二位使用该数值。

若按照原帖逻辑直接循环,当 %wei%0x7F 时,屏幕通常会触发一个删除动作或显示一个控制字符,而不是预期的汉字。

3. 环境依赖与显示机制

在 DOS 环境下,这段逻辑的成功执行高度依赖于**中文系统(外挂汉字库)**的状态。

  • 无中文系统(纯 DOS): 计算机将这两个字节视为两个独立的扩展 ASCII 字符(OEM 字符集),显示为乱码或西文字符。
  • 有中文系统(如 UCDOS, CCDOS, 或 Windows DOS 窗口): 终端驱动(如 HZVGA.EXE)会拦截向标准输出流发送的连续两个字节。当捕获到首字节落在 0x81–0xFE 范围内时,它会暂存该字节并等待下一个字节,组合后从字库中提取字模进行像素渲染。

4. C 语言实现的工程参考

若将原帖的思路转化为标准 C 语言代码,并加入 0x7F 检查,逻辑如下:

#include <stdio.h>

void print_gbk_zone(unsigned char qu) {
    unsigned char wei;
    if (qu < 0x81 || qu > 0xFE) {
        printf("Error: Invalid GBK high byte.\n");
        return;
    }
    
    for (wei = 0x40; wei <= 0xFE; wei++) {
        if (wei == 0x7F) continue; // 跳过控制字符 0x7F
        
        // 在 DOS 中文环境下,连续打印两个字节即合成一个汉字
        putchar(qu);
        putchar(wei);
        
        // 适当增加空格或换行以利于排版
        if ((wei - 0x40) % 16 == 15) putchar('\n');
    }
}

5. 批处理(Batch)实现的限制

原帖作者提到的 %qu% 语法类似于批处理(BAT)。在原生 MS-DOS 的 COMMAND.COM 环境下,由于缺乏内置的 16 进制运算和字符编码直接操作能力,通常需要借助 DEBUG.COM 生成一个临时的汇编小工具,或者配合 ECHO 命令(在特定环境下)来实现。而在现代 Windows 的 CMD.EXE 中,由于默认代码页可能是 936(GBK),使用 set /a 可以进行 16 进制运算,但通过 echo 直接输出双字节字符仍存在截断或转义风险,通常建议使用汇编或 C 实现底层输出。

结论

原帖作者提供的思路捕捉到了 GBK 编码双字节循环的基本特征。在历史开发实践中,这类工具常用于调试字库完整性或制作字符映射表。修正 0x7F 的遗漏并确保在支持双字节显示的驱动(如 UCDOS)下运行,是该逻辑能够正确呈现“GBK 码表”的技术前提。



2019-5-2 12:38
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复

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


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



论坛跳转: