W hy is there a "small house" in I BM's C ode page 437?

20250106

说明:

本文是我文章 The origins of DEL (0x7F) and its Legacy in Amiga ASCII art 的补充。该文章主要讨论 DEL 字符,它是什么,如何使用,以及为什么它有一个视觉表示,重点关注 Commodore 的 Amiga 电脑。AmigaOS 的 Topaz 字体将 DEL 渲染为对角线,而 IBM 的 PC 则将其渲染为……一栋房子。本文是对此的补充说明。

如果没有 Michael WaldenVileR 的大力帮助和深刻见解,这篇文章就不会出现,感谢他们!

如果您想评论(无论大小),请发送电子邮件至 hlotvonen@gmail.com。我将非常感谢,如果有什么需要修复的,我会很乐意更新文章并注明出处。

a-b-c-d-x-y-z...HOUSE?

在 IBM 著名的字符集 Code Page 437 中间有一个小房子(⌂)。"Small house" ——这是 IBM 官方给代码位置 0x7F 的字形起的名称,而逻辑上这里应该存在 "Delete" (DEL) 的控制字符。它很可爱,但有点奇怪。我想知道,它是怎么到那里的?为什么 IBM 用 房子 来表示 DEL 呢?

Code Page 437 table, highlighting the character 'small house' at 0x7F IBM PC 的 Code Page 437

Code Page 437 的崛起

1981 年发布的 IBM Personal Computer (PC) 推出了 IBM 的第一条微型计算机产品线。与此同时,他们引入了一个 8 位字符集,后来被称为 Code Page 437 (CP437)。与早期的 IBM 机器不同,PC 是使用现成的组件而不是 IBM 的专有技术构建的,这催生了大量第三方克隆产品,这些产品被称为“IBM 兼容”系统。IBM PC 架构迅速成为全球主要的计算标准。到 80 年代末,所有售出的微型计算机中,84% 都是 IBM PC 或其克隆产品。[1]

PC 的崛起也意味着 CP437 的广泛采用,使其成为有史以来被复制和识别最多的字符集之一。VileR 的 Ultimate Oldschool PC Font Pack 列出了超过 200 种基于 CP437 的字体,这些字体来自各种 IBM PC 型号及其克隆产品。

CP437 基于 American Standard Code for Information Interchange (ASCII),它定义了前 127 个字符。这对之前使用根本不同的 EBCDIC 标准的 IBM 来说是一个巨大的变化。但是由于 ASCII 仅覆盖了 8 位代码中总共 256 个可用字符中的 96 个 可打印 字符,因此 IBM 必须弄清楚如何处理其余字符。他们没有基于任何扩展 ASCII 的预定义标准或复制其他标准,而是(再次)决定做自己的事情。

一组“不正经”的字符

CP437 的扩展位(字符 128-255)主要包含国际文本字符、框图形状和数学符号的混合物。但是对于未定义的控制字符,他们做了一些非常不同的事情。IBM PC 的创建者之一 David J. Bradley 博士讲述了 origins of the ASCII smiley character 在与 vintagecomputing.com 的 Benj Edwards 的电子邮件对话中:

“现在,对于前 32 个字符(x00-x1F)该怎么办?ASCII 将它们定义为控制代码,回车,换行,制表符……这些字符起源于电传打字机传输。但是我们可以在基于字符的屏幕上显示它们。因此,我们添加了一组“不正经”的字符。它们仅用于显示,不用于传输或存储。它们最有可能的用途是在基于 [text] 字符的游戏中。”[2]

Bradley 提到的 CP437 的前 32 个字符(x00-x1F)包括笑脸、扑克牌花色、音符、太阳符号、性别符号和箭头。Bradley 没有明确提到的是 0x7F 处的字符,它也是电传打字机传输中使用的一个(某种程度上)的控制字符。它被分配给 Delete 字符,该字符用于通过在纸带上打满孔来消除不需要的字符。ASCII 中的全孔模式位于第 127 个代码点,用十六进制的 0x7F 表示。这个字符就像所有其他 32 个控制字符一样,它没有定义的视觉表示,也没有像 IBM PC 这样的数字计算机中的任何特定用途。因此,即使 Bradley 没有明确提到 0x7F,它在 CP437 中也表示为一个微小的像素小屋(⌂),这表明它也属于“不正经”字符组。

Code Page 437 table, highlighting the 'not serious' characters “不正经”的字符

据 Bradley 称,“不正经”的字符是在 4 小时的飞机旅程中开发的。他当然是在夸大其词,但将其作为“表明许多重大决策的快速性”的一种说法。但是,即使他们相对较快地开发了它们,他们也一定是基于 某些东西 的。

这个“某些东西”是什么?IBM 可以遵循现有标准,并从 ANSI X3.32-1973 中获取控制字符的图形,但它们是模糊且难以使用的(参见 The origins of DEL (0x7F) and its Legacy in Amiga ASCII art 的第 2 部分)。相反,选择这些“不正经”的字符可以说是更好的选择,尤其是在商业决策方面。像 0x01 处的笑脸这样的字符变得具有标志性,正是因为它们提供了一种简单的方法来表示基于文本的游戏中的玩家角色,例如 RogueZZT

IBM 绝不是第一个包含“不正经”字符的公司。例如,Commodore 1977 年的 PETSCII 字符集以其图形形状而闻名,其中还包括卡片套装。[3]

PETSCII(手动排序)

甚至美国国家标准协会 (ANSI) 的 X3.2 委员会也考虑为官方 8 位 ASCII 扩展包含一些“不正经”的符号。

8 位 ASCII 扩展的提案。它没有被标准化。最接近 ASCII 的“官方”8 位扩展是 ISO 8859-1(也称为 ISO Latin-1),它扩展了对其他基于拉丁语的语言的支持,由国际标准化组织 (ISO) 于 1987 年标准化。

但是,为什么要添加这些古怪的字符,而添加更有用的字符(例如扩展对其他语言或书写系统的支持)呢?Bob Bemer(“ASCII 之父”)在 1978 年 7 月为 Interface Age 撰写的一篇文章中为他们的加入辩护:

“据推测,卡片套装会吸引您的眼球,您会想知道为什么忽略了这么多其他有用的符号而选择了这些。不用担心,它们总是会派上用场;有时拥有可以重新分配其含义而不会损害编程语言等的符号是有用的。”[4]

Code Page 437 的房子符号(⌂)就是这种情况。它足够模糊,可以类似于许多不同的事物,而不仅仅是房子。例如,在 DOS 游戏 By Fire & Sword (1985) 中,它是一个城镇,在 ZZT (1991) 中,它代表**“能量器”,在 Bugs! (1982) 中,它是玩家的枪**,在 Target (1982) 中,它代表玩家的弹药,在 Numjump (2017) 中,它们是致命的尖刺

Screenshot from Numjump. In this game, the house symbols represent spikes. 在 Daniel Remar 于 2017 年制作的 homebrew DOS 游戏 Numjump 中,房子符号代表尖刺。

Screenshot from ZZT. In this game, the house symbols represent energizers. Epic Games 首席执行官 Tim Sweeney 于 1991 年制作的 ZZT 屏幕截图。在这个游戏中,房子符号代表能量器(在游戏视图的右边缘)。

PC ASCII 艺术家使用房子符号,不是作为具有含义的特定事物,而是纯粹用于其形状和大小,以创建所谓的“newskool”或填充的 ASCII 艺术。在经典的 8×16 像素字符 IBM VGA 字体中,它是少数几个从基线 更高 一个像素的字符之一。

The house, compared to a and $

当与稍微大或小的其他字符组合时,会产生连续形状的错觉:·∙•↔*⌂S§¼╣$♫b%⌂≈←·。

它的排版颜色也相当宽且“暗”,因此它可以填充它所占据的空间,而不会留下任何明显的负空间间隙。换句话说,小心使用时,它不会脱颖而出。

它的倾斜顶部使其可用于创建曲线,如 ddrj 的 drj-mmc.ans(2004 年)中所见(红色突出显示了房子字符):

Screenshot from Numjump. In this game, the house symbols represent spikes. drj-mmc.ans。颜色已从原始颜色更改为突出显示 0x7F 的使用。

关于 CP437 房子起源的理论

但是 IBM 呢?为什么 IBM 决定在其字符集中包含一个代表房子的符号?这是一个奇怪的字形;添加笑脸很容易辩解,并且扑克牌花色也存在于之前的字符集中,但是一座房子——据我所知——在 IBM 的 Code Page 437 之前,它并不存在于任何地方。它似乎凭空出现。据我所知,没有关于字符集设计过程的(幸存的)文档。我们所知道的零星信息来自一些采访,例如与 David J. Bradley 的采访,以及像 VileR 这样的人进行的细致研究。因此,我唯一能做的就是推测。这是我的想法:

致谢

这些理论大多基于我与 VileR 和 Michael Walden 的对话,荣誉归于他们!

理论 #1:房子作为家用计算机的象征

我的第一个想法是,也许房子是作为 IBM 新型个人家用计算机系列的象征而包含的?在 1981 年 IBM PC 发布之前,IBM 主要以其商用计算机而闻名。因此,随着 IBM 进入不断增长的个人计算机市场,他们希望向家庭用户发出信号,表明他们的 PC 有一些 有趣 的东西可以提供——因此添加了“不正经”的字形,例如以基于文本的游戏为目的添加的笑脸。那么也许他们出于同样的原因添加了房子字形?当然,笑脸一定有他们居住的房子!认为这可能是真的很有吸引力,但要明确的是,这纯粹是推测,没有任何证据支持这一说法。

理论 #2:它与退格键有关

VileR 提出了另一个“直觉”。他认为房子字符本身与删除文本的操作相关,或者与退格符号⌫ (U+232B) 相关。如果将⌫顺时针旋转 90˚,您确实会得到一所房子⌂(其中有一个×)。这是一个有趣的想法,但似乎也没有任何证据支持这一说法。

理论 #3:它来自 System/23 Datamaster

在 Benj Edwards 的电子邮件采访中,David Bradley 还提到,“严肃字符”的选择基于 IBM PC 在 IBM 的直接祖先 System/23 Datamaster。[5] VileR 找到了 Datamaster character ROM image,这证实了某些字符序列 不变地复制到 CP437(üéâäàåçêëèïî)。但是,没有房子符号或任何类似于它的东西。

理论 #4:它来自 Wang 文字处理机

在博客文章 Weird Tales 中,OS/2 Museum 的 Michal Necasek 检查了 Bill Gates 的说法,即 Microsoft 希望 IBM 将一些 Wang 文字处理字符(“笑脸、盒子、三角形等”)复制到 IBM PC 的字符集中,因为他们正在考虑创建自己的 Wang 克隆产品。Necasek 半驳斥半证实了这些说法,因为没有一个 Wang 字符集有笑脸,但它们确实与 CP437 共享一些非常相似的字符,这不太可能是巧合。这些包括左/右三角形、盒子、菱形、双感叹号和几个箭头。[6] 但是,同样,没有一个 Wang 字符集包含房子符号,因此 IBM 不可能从那里复制它。

理论 #5:它来自 Blissymbolics

因此,IBM 没有通过从其他字符集复制房子字形。但是 IBM 的团队不太可能在真空中设计房子符号。如果它不是来自另一个计算机系统,那么也许他们通过查看现有符号系统和图像符号的书籍找到了它?

An icon for a hotel resembles CP437's house glyph

例如,ICAO 在 1970 年代使用的酒店图标在形状上与 CP437 的房子非常相似。[7]

A house symbol from blissymbolics

另一个可能的影响是 Blissymbolics。它最初是在 1949 年开发的,但在 1970 年代和 1980 年代重新流行起来。[8] Blissymbolics 房子字形与 IBM 在 0x7F 处的字符非常相似。[9] 如果 IBM 正在查看符号书籍,寻找其新字符集的灵感,他们可能会遇到 Blissymbolics。时间线符合:Teaching and Using Blissymbolics 一书于 1980 年出版,当时 IBM 正在开发 CP437。

旁注

有一个 recent proposal 将 Blissymbolics 添加到 Unicode!

理论 #6:点拉伸的 Wang delta 的拙劣副本

或者也许它 确实 来自 Wang?Viler 提出了一个有趣的观察结果:1979 年的 2236DE terminal 的 Wang 字符集在位置 0x9A 包含一个 delta 符号 (Δ)。乍一看,这似乎与 IBM 在 0x7F 处的房子符号无关。但是在将 ROM 数据作为位图查看后,VileR 发现了两个有趣的事情。首先,Wang 的 delta 不是一个干净的等边三角形(角度为 60°、60°、60°);为了避免扫描线之间出现不均匀的位移,这会在低分辨率 CRT 上产生非常明显的“锯齿”,因此 delta 被渲染为直角三角形(角度为 45°、90°、45°)。但是,因此,必须切掉三角形的边角,以使其适合其 7×7 像素字符空间。其次,VileR 发现位图的像素间隔开,这意味着字形依赖于显示电路中的某种点拉伸效果。在实现这些之后,使用他的 CRT emulator 渲染位图显示 Wang 的 delta 实际上类似于 IBM 的块状房子符号。

Comparison between Wang's character set as raw ROM data and CRT emulated Wang 的字符集作为原始 ROM 数据和 CRT 模拟之间的比较。这是 IBM PC 房子的起源吗?从 VileR 的图像编译。

因此,如果 Bill Gates 关于 IBM 从 Wang 复制字符的说法是正确的,那么 IBM 的人们完全有可能直接从 Wang 终端屏幕复制字形,将 delta 误解为房子,特别是考虑到 Bradley 指出,整个过程都很仓促。这不是最终的证据,但仍然是一个引人入胜的理论!

理论 #7:是 delta 吗?

但是,在电子邮件对话中,Michael Walden 推测,DELete 字符将 DELta 作为其可打印的字符字形可能甚至不是巧合。

Delta 作为符号 (Δ) 源自希腊字母。CP437 已经在 0xEO–0xEB 范围内包含一些希腊字符,特别是 0xEB 是希腊 小写 delta (δ) 的符号。包含这些字符不是为了支持希腊语,而是作为数学符号。在数学和其他科学中,大写 delta 通常用于表示“任何可变数量的变化”,这可能是将其包含在字符集中的一个原因。

Delta 不仅出现在 Wang 的字符集中,而且出现在之前的许多字符集中。例如,起源于 1960 年代 IBM 的面向数组的编程语言 (APL) 在其语法中包含 delta (Δ) 和倒置的 delta (∇)。作为一个好奇但无关的巧合,倒置的 delta 的 IBM 名称是 DEL——与 0x7F 处的控制字符 DEL(Delete)相同。[10]

APL 符号出现在一些早期的 IBM APL 键盘上,例如 1971 年的 IBM 3270。VileR 还指出,IBM 从 1970 年代中期开始的第一台台式机 5100/5110/5120 从一开始就是为 APL 准备的,但没有证据表明它们以任何方式影响了 IBM PC 的开发,即使它们在同一个型号编号系统中(IBM PC 是 5150)。还值得注意的是,IBM 的 APL 字符集(例如 Code Page 909)有时会同时包含 delta 房子符号。因此,房子和 APL 的 delta 之间似乎没有很强的联系。

理论 #8:它 就是 delta?!

等等……让我们检查一下我们的基本假设。我们如何 绝对确定 IBM 甚至打算将 0x7F 处的字形 ⌂ 表示为房子?如果整个前提都是错误的怎么办?

当我浏览 IBM PC 的原始 1981 Technical Reference 手册时,我意识到任何地方都没有提到“房子”。事实上,明确列在位置 0x7F 的字符根本不是房子——它是一个 delta (Δ)!

0x7F is displayed as delta 1981 IBM PC Technical Reference

它一直都打算成为 delta 吗?

但是当然它没有那么简单。1982 年版的 IBM BASIC Manual 非常明确地将代码点 0x7F 显示为房子

IBM BASIC Manual displays 0x7F as house 1982 IBM BASIC Manual

发生了什么?1981 Technical Reference 是否打印错误,后来进行了更正?似乎不是:1984 年修订版的 IBM PC Technical Reference 仍然将 0x7F 显示为 delta。没有错误,即使 0x7F 的 文本标签 也是“delta”,如打印的 System BIOS 字符生成器例程中所列。

0x7F is displayed as delta 1984 IBM PC Technical Reference

尽管如此,原始的 1981 IBM PC System BIOS fonts 清楚地将其渲染为 房子:⌂。似乎不太可能有人会将它的形状与 delta 字符联系起来——更不用说在任何科学语法中 房子字符用作 delta。

也许这只是印刷材料和实际字体渲染之间的一些粗心大意?也不是这样:并非在每个 CP437 字体中,0x7F 都一致地渲染为房子,如下面的图表所示,该图表显示了来自各种 CP437-compatible VGA fonts 的 0x7F 字符:

虽然大多数字体将 0x7F 渲染为房子,但其中一些字体无疑是 deltas(列在图表底部附近)。

为了使事情更加混乱(或者也许是为了防止进一步的混乱?),在 1984 年,IBM 自己的字形名称权威注册表 (GCGID) 官方将 CP437 中的 0x7F 命名为 "small house"。事实上,最初 整个字符集都没有名称,直到这次注册。Code Page 437 根本不是作为一个真正的代码页诞生的——它只是一堆图形字形,存储在 System BIOS 的只读存储器 (ROM) 中,可供计算机在启动时立即使用。由于字符是在硬件中实现的,因此字体及其派生通常被称为“OEM 字体”,其中 OEM 代表“原始设备制造商”。字符集及其字形的所有“官方”IBM 名称都是在 1984 年追溯给出的。

但是即使官方命名 Code Page 437 及其字形也不足以纠正它们的渲染。在 1986 年,IBM PC Convertible 系统字体将 0x7F 渲染为 delta,并且 1986 IBM PC/AT Technical Reference 仍然将 0x7F 列出并标记为 delta。即使在 1989 年,Olivetti MS-DOS Software Installation Guide 也将 0x7F 渲染为 delta。

理论 #9:它 必须 是 delta,因为即使 GREEK delta 看起来也像房子!

当我再次查看 VileR 的 oldschool PC 字体页面上的原始 IBM BIOS font 时,有些东西引起了我的注意。由于 IBM PC 在许多非英语国家/地区销售,因此原始字符集具有特定于语言的变体。希腊语 IBM PC 当然添加了对其他希腊字符的支持——包括实际的希腊语大写 delta。而且——这让我感到非常惊讶——它的字形看起来 实际的房子字符 更像 房子!

The greek delta is displayed as a house! 希腊语 IBM PC 字体(Code Page 737)的变体将希腊语 delta 渲染为房子!

如果即使实际的希腊语大写 delta 也被毫不含糊地渲染为房子,那么 DEL 只是一个底部角落被切掉的(由于缺少水平像素)的格式不佳的希腊语大写 delta 字符的理论开始显得越来越有说服力。

Delta 理论的怀疑

我只是有一件事不太明白。让我们假设 DEL 应该成为 delta。在确定房子字形之前,IBM 真的 没有 尝试不同的绘制 delta 的方法吗?稍加努力,即使在 8×8 像素空间中也完全可以绘制一个令人信服的 delta。这是一个比较图表。前三个是 IBM 对“delta”的再现,其余是我在 10 分钟内拼凑起来的尝试。我认为我绘制的任何版本都可以更清楚地理解为 deltas。因此,如果 IBM 确实 经历了一些 delta 的版本,他们可能会得到与我的版本相同或非常相似的形状——但他们 仍然 选择看起来