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


9

我已经看到许多日文和中文的文本模式BIOS设置程序屏幕。最近,我什至看到日语的Windows XP安装程序。MS-DOS也有日语版本。真正的DOS模式,不是Windows命令提示符!

日语BIOS设置

日语MS-DOS 6.2

一种典型的文本模式屏幕的大小为80x25。由于日语字符的大小是普通拉丁字符宽度的两倍,因此可以在屏幕上同时显示的日语字符的最大数目约为1000。因此,我们需要2000个代码点来显示字符的左右部分。

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

[ 日语XP安装程序] 8

Linux中的文本模式似乎使用图形模式驱动程序,因为它可以显示Unicode并具有更多的颜色。但是我无法解释他们如何在MS-DOS和BIOS设置屏幕中执行此操作。


编辑:我什至找到了DOS日语文本输入

日语输入法

文字模式中也有韩文!

韩语

VMWare韩文DOS


您可能不是在看日语的“字符”,即kanji,而是平假名片假名,它们确实具有Unicode映射。
锯末

@sawdust:看看上面的图片,您会看到它不仅可以显示所有假名,而且可以显示汉字
phuclv 2013年

1
请注意,您可能从中获取了OS / 2安装程序屏幕快照的页面在屏幕快照的旁边显示了“引导OS / 2时几乎立即初始化了图形文本模式支持”的屏幕快照。关键字图形
CVn 2014年

@MichaelKjörling它不仅是OS / 2,而且MS-DOS和BIOS设置程序在文本模式下也具有此功能
phuclv 2014年

Answers:


6

正常的“ 80x25字符”模式实际上是720x350像素(意味着每个字符单元格的宽度为9像素乘以14像素高)。全角字符模式(“ 40x25”)可以通过将每一列加倍以将其内插到更大的宽度以节省视频内容存储器(将所需的视频内容存储器数量减少一半),或者使用附加的字形存储器和相同的字符视频内容存储器的数量,以将字符单元格增加到18 * 14像素。

相当早(我认为是在引入EGA时完成的),对用户定义的字符字形的支持已添加到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的1位像素处有65,536个字形可达到大约2 MiB,这在当时是可观的但并非不可克服的内存量。

基本的美国英语至少需要62个专用字形(数字0-9,大写和小写字母AZ),因此如果您还希望能够同时显示美国英语文字,则可以使用180-190字形时间,每个字形带有8位。如果您可以在没有美国英语同时支持的情况下生活(您可以选择在资源受限的环境(例如早期的IBM PC架构)中这样做),则可以使用全部字形。

通过一些技巧,您可能也可以将两种方案混合使用。

我不知道它是如何实际完成的,但是这两种方法都是可行的方案,它们可以将特别有限的字符数“花式”字母以文本模式显示在纯IBM PC屏幕上,我可以坐在前面交换堆栈的时间。很有可能还有其他图形模式可以使此操作更容易实现。

另外,请记住,在文本模式显示文本的图形模式之间的区别。如果您处于图形模式,也许通过广泛支持的VESA,就可以独自绘制字符字形,但是在绘制它们方面也有更多的自由。例如,我非常确定Windows NT(Windows XP属于该产品系列)的基于文本的部分使用图形模式显示文本,包括Windows NT 4.0引导屏幕和BSOD。


您可能会看到,日文/韩文全角字符旁边还有正常宽度的拉丁字符,因此它不能是40x25的全角模式。因此,您无法将每4个字节中的2个字节组合起来来表示该字形。使用前景色的第3位,你可以在同一时间表示512个的字形,但还是不够的,如果字符填充屏幕的大部分en.wikipedia.org/wiki/VGA-compatible_text_mode#Fonts
phuclv

@LưuVĩnhPhúc您可以收回高位,或使用任何数量的其他技巧来将需要多字节字符与单字节字符混合在一起。我仍然认为答案是要承认开头段落中的陈述:即使显示字符,在某种程度上您仍在处理像素,并且即使不是直接使用,也可以使用这些像素。
CVn 2013年

我知道所有基于文本和图形模式显示文本的东西,只是混淆它们如何为多字节提供足够的代码点,因为左右部分需要2个代码点。但是从您所说的开始,我想到了另一种方法。我认为您的回答是可以接受的
phuclv 2013年

1

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

在文本模式下,您拥有“屏幕内存”,每个屏幕字符有1个字节,告诉适配器在每个屏幕位置出现的字符。(也有“属性”字节告诉适配器什么颜色以及下划线,闪烁等颜色)。

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

从CGA开始,您可以告诉适配器将字符表放在适配器RAM中的特定位置。每个适配器都有一个字符ROM,该字符ROM具有该卡的默认“字体”(这是标准的IBM字体),但是您可以告诉适配器切换到RAM中的某个位置,然后在其中放置自己的映像。

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

因此,如果可以将正确的图像放入适配器的RAM中并具有必要的软件支持,则显示其他语言是可以的。


是早于CGA吗?我一定要老了。(为我的辩护,我确实从内存中写出了这个答案,并且甚至
从没

我认为您对它的看法是对的,那就是EGA。
LawrenceC

我知道我们可以通过更改指针来更改文本字体,几年前我已经学会了如何做,只是不知道它们如何表示双字节字符集,因为256或512个代码点甚至都无法容纳屏幕上足够的最大不同字符数,不计算整个复杂字符集
phuclv 2013年

1

我在Wikipedia的“ VGA兼容文本模式”页面以及某些VGA编程书籍中找到了一些东西:

EGA和VGA文本模式均允许在屏幕上同时显示512个字形,或2个存储库,每个组具有256个字形。属性位3(前景颜色强度)也可以在存储体A或B之间进行选择。通常发生的情况是,默认情况下,A和B字体寄存器都指向相同的地址,仅给您256个字形。因此,要使其正常工作,必须将字体寄存器设置为正确的地址。

每个存储体都有8192字节,存储体中256个字形中的每一个都有32个字节(宽8像素,高32像素)。您可以设置“扫描线计数”寄存器,以判断字符的正确高度。VGA卡在屏幕上打印400条扫描线,而EGA在屏幕上打印350条扫描线,因此,为了给您提供25个字符行,它们将字符高度分别设置为16和14条扫描线。同样,在VGA中,每个字形可以具有8或9个点的宽度,但是第9列不是空白,就是第8列重复。两个库中的所有这些字形都可以由用户定义。

在某些语言中,如何在屏幕上获得超过256个不同的字符?在上面的示例中,每个特殊外来字符都是由两个或更多个字形(左和右)组成的。您可以将银行A的第一个字形设置为ASCII文本,例如,银行A的第128个字形,而银行B的256个字形= 384个字形,您仍然可以自定义。

另外,您可以组合不同的左右两侧以构成一个巨大的字符集!举例来说,假设您要从384个用户定义的字形中为左侧保留184个,为右侧保留200个:您可以拥有184 * 200 = 36800个不同的字符!(当然,其中大多数对于该语言可能是无效字符,但您仍然可以获得大量有效组合)。

在上面的日语示例中,您具有共享左侧​​字形的“ ha”和“ ba”字符。与“ si”和“ zi”字符相同。“ ko”和“ ni”右侧非常相似,它们可以共享相同的右侧字形。关于“ ru”和“ ro”字符也可以这样说。有了好的设计,您可以很好地扩展您的字符集。屏幕左上方(灰色)显示“ le”字符的右侧标志符号,垂直滚动条中的向上和向下按钮也已更改,这意味着存储库A的至少一部分还用于容纳新字形。

总而言之,早期PC时代的BIOS字符串功能不支持Unicode,但并非必须如此。您要做的就是自定义512个字形并设置正确的EGA或VGA寄存器。例如,您可以自定义外来字符(在存储区A或B中)的“!@”“#$”“%^”“&*”“ç锓ñÑ”字形,然后使BIOS打印“!”。 @#S%^&*çéñÑ“字符串。BIOS不会检查字形。您也根本无法使用BIOS功能,因为您可以直接在视频内存中进行写入。要使用库B的字形,只需将字符前景颜色属性设置为8到15之间的值(明亮的颜色)。

(对不起我的英语不好)


我知道问题中提到可以有512个字符。然而,问题是上面的那些程序显示的是真正的汉字字符,而不是假名,这大大增加了同时显示的内容数量。在有限编码的系统中,将使用片假名的半角片假名,它们有单独的maru和tenten,因此code和じ或は和ば可以使用相同的代码点,而无需共享左右部分
phuclv

0

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

嗯,DOS本身不能以超出每个字符1个字节的字符集进行打印,因为它使用BIOS功能,而BIOS功能又使用了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还通过以下15种新功能通过int 15h添加了对V-Text的支持

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

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

不过,图形模式的缓慢性可能在滚动时引入毛刺,这需要特殊处理

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

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

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

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

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

例如,IBM Personal System / 55使用带有日语字体的特殊图形适配器,因此它们获得了纯文本模式

在1980年代初期,IBM日本公司针对亚太地区发布了两条基于x86的个人计算机产品线,即IBM 5550和IBM JX。5550从磁盘读取汉字字体,并在1024 x 768高分辨率监视器上以图形字符形式绘制文本。

https://zh.wikipedia.org/wiki/DOS/V#历史

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

AX体系结构采用了特殊的杰加适配器而不是标准的EGA

AX(扩展架构)是日本的一项计算计划,始于1986年左右,允许PC通过特殊的硬件芯片处理双字节(DBCS)日语文本,同时允许与为国外IBM PC编写的软件兼容。

...

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

更高版本还添加了特殊的AX-VGA / H硬件和AX-VGA / S,用于在VGA上进行软件仿真

但是,在AX发行之后不久,IBM发行了与AX显然不兼容的VGA标准(它们不是唯一推广非标准“ super 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的主存储器和256 KB的视频RAM。主显示控制器处理字体ROM,显示JIS X 0201(7x13像素)和JIS X 0208(15x16像素)字符

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


-1

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

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


不,看看我发布的图像,它是真正的DOS模式,而不是Windows中的命令提示符
phuclv 2013年

文章中的标题完全是错误的并且具有误导性。尽管cmd.exe 的终端界面类似于DOS和一些类似的命令,但它不是 DOS。命令提示符和MS-DOS是同一件事吗?
phuclv
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.