MS-DOS 和其他文本模式程序如何显示全角 CJK 字符?

MS-DOS 和其他文本模式程序如何显示全角 CJK 字符?

我见过许多日文和中文的文本模式 BIOS 设置屏幕。最近我甚至还见过日文版的 Windows XP 设置。MS-DOS 也有日文版。真实DOS模式,而不是 Windows 命令提示符!

日文 BIOS 设置

日语 MS-DOS 6.2

通常,文本模式屏幕的大小为80x25。由于日文字符是正常拉丁字符宽度的两倍,因此屏幕上同时显示的日文字符的最大数量约为 1000 个。因此我们需要2000 个代码点显示字符的左边和右边部分。

由于默认文本模式只能显示 256 个字符,但前 128 个字符用于 ASCII,因此可用的字符仅限于高 128 个代码点。如果需要,我们可以通过减少颜色数量将其扩展到 512,但这仍然无法支持足够的代码点进行显示。我一直想知道他们是如何设法用如此有限的字符数来显示庞大的字符集的。

日文版 XP 安装程序

Linux 中的文本模式似乎使用图形模式驱动程序,因为它可以显示 Unicode 并且颜色更多。但我无法解释它们如何在 MS-DOS 和 BIOS 设置屏幕中做到这一点。


编辑:我甚至找到了一个DOS 中的日文文本输入

日语输入法

文本模式也有韩语!

韩国人

VMWare 韩国 DOS

答案1

正常的“80x25 字符”模式实际上是 720x350 像素(即每个字符单元宽 9 像素,高 14 像素)。双倍宽度字符模式(“40x25”)可以通过将每列加倍来将其插入到更大的宽度以节省视频内容内存(将所需的视频内容内存量减半),或者使用额外的字形内存和相同数量的视频内容内存将字符单元增加到 18*14 像素。

相当早的时候(我认为是在尾气分析仪自 1997 年推出以来,IBM PC 的文本显示模式中就添加了对用户定义字符字形的支持。

IBM PC 的普通文本模式只是特定地址上的连续 4000 字节视频内容 RAM。这些内容被读取为一个字节的字符属性(最初是闪烁、粗体、下划线等;后来重新用于前景色和背景色以及闪烁/突出显示,因此文本模式下颜色限制为 16 种)和一个字节描述要显示的字符。每个字符字节值要显示的实际字形存储在其他地方。

这意味着,只要您一次可以在屏幕上处理 256 个不同的字形,并且每个字形都可以表示为 9x14 的一位位图,您就可以简单地替换内存中的字形以使字符以不同的方式显示。从某种程度上讲,这是mode con codepage selectDOS 上所做的一部分。这是相对微不足道的事情。

如果您需要超过 256 个不同的字形,但又可以接受屏幕上字形数量的减少,那么您可以采用 40x25 方案,使用双倍宽度(18 像素宽)的字形。假设视频内容 RAM 的总量是固定的,并且假设您可以增加字形位图内存,那么您可以改为使用每四个字节中的两个字节来表示一个屏幕上的字形,这样您就可以访问 2^16 = 65,536 个不同的字形(包括空白字形)。如果您敢于尝试,甚至可以跳过第二个属性字节,这样您就可以访问 2^24 ~ 16.7M 个不同的字形。这两种方法都依赖于特殊的软件支持,但硬件和固件部分应该相当容易实现。18x14 一位像素的 65,536 个字形大约需要 2 MiB,这在当时是一个相当大的但并非无法克服的内存量。 18x14 一位像素上的 256 个字形大约为 8 KiB,即使在 20 世纪 80 年代上半叶 EGA 开发和推出时,这也是绝对合理的。

基本美式英语至少需要 62 个专用字形(数字 0-9、大写和小写字母 AZ),因此如果您还想同时显示美式英语文本并使用每个字形 8 位,则可以使用大约 180-190 个字形。如果您可以忍受没有同步美式英语支持(您可能选择在资源受限的环境(例如早期 IBM PC 架构)中这样做),那么您可以使用全部字形。

利用一些技巧你也许可以将这两种方案混合搭配起来。

我不知道它到底是怎么做到的但这两种方案都是可行的方案,用于将字符数特别有限的“花哨”字母以文本模式显示在普通的 IBM PC 屏幕上,而我坐在 Stack Exchange 前想了一会儿就想出了这个方案。完全有可能有其他图形模式可以使这在实践中更容易实现。

另外,请记住文本模式图形模式显示文本。如果您处于图形模式,可能通过普遍支持的 VESA,您可以自行绘制字符字形,但您在绘制字符字形方面也拥有更多的自由。例如,我很确定 Windows NT(Windows XP 所属的产品系列)的基于文本的部分使用图形模式来显示文本,包括 Windows NT 4.0 启动屏幕和 BSOD。

答案2

我做了一些研究,正如我所料,你必须使用图形模式或需要特殊的硬件支持,因为在 VGA 文本模式下无法使用超过 512 个字符

嗯,DOS 本身无法打印超过 1 个字节/字符的字符集,因为它使用 BIOS 功能,而 BIOS 功能又使用 VGA 硬件,而 VGA 硬件不能拥有超过 2 x 256 个字符大小的字体。因此,这听起来又像是驱动程序的工作,驱动程序使用图形模式来呈现大量字体。我们已经在一些图形 DOS 文本编辑器和类似编辑器中支持 Unicode 字体(谢谢 :-)),并且无论使用 DBCS 还是 UTF-8,两者都具有“字符大小可以是一个或多个字节”处理“异常”的共同点。

FreeDOS 是否会官方支持日语?

日文版 DOS(DOS/V)使用第一种方法模拟文本模式经过在图形模式下渲染字符使用特殊驱动程序。驱动程序遵循 IBM V-Text 标准,这是一种扩展 DOS 文本显示功能的机制。您可以选择各种16/24/32/48 点字体像这样

DOS/V 字体

一些其他文本模式系统也使用同样的技术。在 FreeDOS 中,你可以加载一些特殊的驱动程序获得日语支持

FreeDOS 日文驱动程序

渲染器将​​拦截 int 10h 和 int 21h 调用并手动绘制文本,因此它甚至可以用于普通的英文程序。但它不适用于直接写入 VGA 内存的程序。为了打印日文字符,还连​​接了 int 5h 和 int 17h。

根据DOS/V 手册后来 IBM BIOS 还通过 int 15h 增加了对 V-Text 的支持,其中包含以下 4 个新功能

5010H Video extension information acquisition
5011H Video extension function registration
5012H Video extension driver release
5013H Video extension driver lock setting

我想这也是我在旧电脑的 BIOS 中看到日语支持的原因

尽管如此,图形模式的缓慢滚动时可能会出现故障需要特殊处理

DOS/V 实际上是第一个针对日文文本模式的软件解决方案

与此同时,自 20 世纪 80 年代初以来,IBM 日本公司一直在进行认真的研究,以开发出一种软件解决方案来解决显示日文字符的问题。随着高分辨率 VGA 显示器、更快的处理器以及更大的内存和硬盘的出现,IBM 藤泽和大和研究实验室的设计师意识到,有关汉字字符形状和大小的信息可以存储在磁盘上,加载到扩展内存中,并通过图形模式 VRAM 显示。(顺便说一下,DOS/V 中的“V”来自通过软件显示日文字符所需的 VGA 显示器。)

DOS/V:硬件问题的软件解决方案

根据同一篇文章,在 DOS/V 发明之前,其他系统都需要硬件中的汉字 ROM

所有品牌的计算机都使用硬件解决方案来处理日文字符的显示,将所有字符的数据存储在称为汉字 ROM 的特殊芯片上。这种方法需要将键盘输入的每个字符的双字节代码发送到 CPU,然后 CPU 从汉字 ROM 中获取相应的字符并通过文本模式 VRAM 将其发送到屏幕。使用汉字 ROM 意味着每个字符的形状是固定的,而使用文本模式 VRAM 则为每个字符设置了标准的 16x16 点大小。

例如IBM 个人系统/55它使用带有日文字体的特殊图形适配器,因此它们可以获得真正的文本模式

20 世纪 80 年代初,日本 IBM 针对亚太地区推出了两款基于 x86 的个人计算机产品线,IBM 5550 和 IBM JX。5550 可从磁盘读取汉字字体,并在 1024 x 768 高分辨率显示器上将文本绘制为图形字符。

https://en.wikipedia.org/wiki/DOS/V#History

与 IBM 5550 类似,文本模式为 1040x725 像素(12x24 和 24x24 像素字体,80x25 字符),8 种颜色,可以显示从字体 ROM 读取的日文字符

AX 架构使用特殊的 JEGA 适配器代替标准 EGA

AX(Architecture eXtended)是日本于 1986 年左右启动的一项计算计划,旨在允许个人电脑通过特殊的硬件芯片处理双字节(DBCS)日语文本,同时允许与为外国 IBM 个人电脑编写的软件兼容。

...

为了足够清晰地显示汉字,AX 机器的 JEGA (ja) 屏幕分辨率为 640x480,而不是当时其他地方流行的 640x350 标准 EGA 分辨率。用户通常可以通过输入“JP”和“US”在日语和英语模式之间切换,这也会调用 AX-BIOS 和 IME 来输入日语字符。

后续版本还添加了特殊的 AX-VGA/H 硬件和 AX-VGA/S,用于 VGA 上的软件模拟

然而,AX 发布后不久,IBM 就发布了 VGA 标准,而 AX 显然与该标准不兼容(他们并不是唯一一家推广非标准“超级 EGA”扩展的公司)。因此,AX 联盟必须设计一个兼容的 AX-VGA(ja)。AX-VGA/H 是使用 AX-BIOS 的硬件实现,而 AX-VGA/S 是软件模拟。

由于软件较少和其他问题,AX 失败了,无法打破 PC-9801 在日本的主导地位。1990 年,IBM 日本推出了 DOS/V,使 IBM PC/AT 及其克隆产品能够使用标准 VGA 卡显示日文文本,而无需任何附加硬件。不久之后,AX 消失了,NEC PC-9801 开始衰落。

NEC PC-98系列显示控制器中也有一个字符 ROM

标准 PC-98 具有两个 µPD7220 显示控制器(一个主控制器和一个从控制器),主内存分别为 12 KB,视频 RAM 为 256 KB。主显示控制器处理字体 ROM,显示 JIS X 0201(7x13 像素)和 JIS X 0208(15x16 像素)字符

我不知道中文和韩文的情况,但我认为使用了相同的技术。我不确定是否还有其他方法可以实现这一点

答案3

这简化了@Michael Kjörling 所说的话。

在文本模式下,您有“屏幕内存”,其中每个屏幕字符有 1 个字节,用于告诉适配器在每个屏幕位置上显示什么字符。(还有“属性”字节,用于告诉适配器显示什么颜色以及下划线、闪烁等内容)。

适配器使用该字节索引另一个包含字符的小 8x12 或任何位图的“字符表”。DOS 将此字符表称为代码页。

从 CGA 开始,您可以告诉适配器在适配器 RAM 中的特定位置获取字符表。每个适配器都有一个字符 ROM,其中包含该卡的默认“字体”(即标准 IBM 字体),但您可以告诉适配器切换到 RAM 中的某个位置并将您自己的图像放在那里。

只要软件知道发生了什么,屏幕内存中指向字符表中图像的代码就不必与任何 ASCII 代码对齐,尽管如果对齐会更容易。您会注意到屏幕内存代码(和字符表形状)为 1-31,它们是不可打印的 ASCII 字符 - 但通过直接写入屏幕内存(想起了在DEFSEG = &HB800 : POKE 0,1GW-BASIC 中将最上面的字符更改为笑脸的美好回忆),您仍然可以显示它们。

因此,如果您可以将正确的图像放入适配器的 RAM 并获得必要的软件支持,那么显示其他语言也是可以的。

答案4

您需要图形模式而不是硬编码文本模式,以便可以显示 unicode 文本字形。然后,您将 MS-DOS 设置为使用 unicode 字体,并更改语言映射以使用该字体。

http://www.mobilefish.com/tutorials/windows/windows_quickguide_dos_unicode.html

相关内容