波兰字母Ś消失的奇异案例

Hacker News Top 新闻

摘要

深入探讨Medium上波兰字母Ś消失的bug,通过打字机历史、共产主义和Unicode规范化追溯问题根源。

暂无内容
查看原文
查看缓存全文

缓存时间: 2026/06/28 13:57

# 消失的波兰字母Ś的奇怪案例 来源:https://aresluna.org/the-curious-case-of-the-disappearing-polish-s/ Marcin Wichary 2015年2月2日 / 1800字 最初发表于 Medium Engineering (https://medium.engineering/) ## 一个酝酿了三十年的键盘 Bug 几周前,有人在 Medium 报告了这个问题: “我刚用波兰语开始写一篇文章。我可以打出所有字母,除了 Ś。当我按下 Ś 的键时,这个字母就是不出来。只有 Medium 上会出现这个问题。” 这很奇怪。我们并没有对任何语言做特殊处理,就算有……在 32 个波兰语字母中,为什么偏偏是这一个 (https://en.wikipedia.org/wiki/%C5%9A) 引起麻烦? 结果发现,这并非偶然。这是一个关于四个看似无关的因素——跨越数十年(甚至数百年)——如何共同导致一个最离奇的 Bug,以及我们如何修复它的故事。 ## 原料 1/4:波兰语 波兰语是使用人数第二多的斯拉夫语言,仅次于俄语,略多于乌克兰语。但与这两者不同,波兰语和德语、法语等西欧语言类似,使用英语/拉丁字母,并带一些自定义修改。 这是基础的英语字母表,基本上与经典拉丁/罗马字母表相同: 波兰语原生的单词从不包含 Q、V 或 X,但我们保留了它们用于拉丁语和其他外来词: 作为交换,波兰语在拉丁字母基础上增加了九个变音符号字母,且都相对常用: 从20世纪初开始,打字机需要容纳这额外的9个字母。如果你比较一台美式打字机和一台波兰语打字机: ……看键盘的右侧,可以看到两个变音字母 – Ł 和 Ż – 被提升为独立按键,其余的则与数字共享按键。(打字员被鼓励通过先打一个拉丁字母、退格、然后在上面覆盖一个重音符号来“模拟”正确的字母,从而拼出剩余七个字母的大写形式。这在打字机时代并不罕见。) 为了给额外字母腾出空间,打字机不得不舍弃一些标点符号,最明显的是分号(逗号 + 退格 + 冒号)以及括号(日常使用中被斜杠取代)。 ## 原料 2/4:共产主义 对于对20世纪80年代早期个人计算感兴趣的人来说,波兰的共产主义意味着两件事: - 可支配收入不多, - 禁止从西方商业进口电脑(个人进口仍然可能,前提是你有足够的外币和获取外币的途径)。 我在波兰长大。我的第一台电脑——光荣的 Atari 800XL——是1979年的原始技术,1983年重新包装。我在1986年得到了它,二手的。 这在铁幕那一边并不罕见;大多数电脑都是从西方进口的。禁止商业进口意味着在很长一段时间内,没有商业实体能为在波兰使用而准备电脑。外国电脑到达时带着原始说明书、未翻译的软件以及像这样的美式键盘: 而法国、德国等国家则得到了定制键盘的早期个人电脑,其布局紧密模仿了之前的打字机…… 早期带有法语 AZERTY 和德语 QWERTZ 布局的 IBM 键盘……而在波兰,我们必须找到另一种方法来输入我们语言独有的9个变音字母。 我们的额外字符看起来很像是拉丁字母的等价物,并且只占字母分布的约8%(你在玩 Scrabble (https://en.wikipedia.org/wiki/Scrabble_letter_distributions#Polish) 时会讨厌它们),但它们很重要。你不能随便把它们换来换去。考虑这两个相似的短语: 完全可以互换,对吧?嗯,并不完全: 还有更多这样的例子。事实上,在那早期PC时代,我很高兴我的全名 Marcin Kazimierz Wichary 不包含任何会让我的生活复杂化的变音符号。 不过,肯定有办法解决吧?回到键盘: 我们不能以任何方式修改它,因为那需要搞硬件,但我们仍然可以尝试找到一个聪明的解决方案。有两个修饰键——Ctrl(位于今天的Caps Lock位置)和Alt。Ctrl已经作为常用快捷键使用,甚至早在CtrlC和CtrlV成为复制粘贴的标准载体之前。但Alt相对不常用。于是,一个事实上的标准诞生了,将8个变音符号分配给它们的拉丁字母对应键,一个分配给附近的一个键: 人们开始将较旧的布局称为“打字员布局”,将新发明称为“程序员布局”,要么是因为早期的PC用户大多是程序员,要么是因为它保留了编程中经常使用的所有标点符号。 新布局在人体工学上是一场噩梦——看看其中有多少字母非常靠近左边的单个Alt键,并且需要用同一只手按下——但它容易理解,不需要任何昂贵的硬件修改甚至便宜的修改(例如贴纸)。它坚持了下来。附近其他几个国家——罗马尼亚、捷克斯洛伐克——也想出了类似的方案。 这种设置非常成功,以至于十年后,当合适的打字员键盘开始出现时,几乎没有人愿意切换到它们,这与大约80年前不太理想的 QWERTY (https://aresluna.org/the-primitive-tortureboard/) 的崛起如出一辙。 当代打字员布局 vs. 当代程序员布局(或者说,美式键盘) ## 原料 3/4:旧习难改 今天常见的自动保存需要等待合适的时机。尤其是在20世纪80年代,甚至90年代,保存文档是很费时的(启动软盘驱动器并写入磁盘需要一些时间),会慢慢磨损你使用的任何介质,有时还会占用CPU以至于无法用于其他任何操作。 手动保存相当于今天的备份:一种你需要为了自己好而学会的习惯。不幸的是,那些没有学会的人通过惨痛的方式明白了这一点——在一个容易残酷且频繁崩溃的电脑上写了几小时,却发现自己忘了保存工作。 我就是其中之一。我们都学会了每当我们喘口气时就按下CommandS或CtrlS。有时是每段之后。常常是每句之后。后来,甚至每两个字之后。CtrlS成为一种埋藏在人们运动记忆 (https://medium.com/change-objects/goodbye-ctrl-s-8f424e463dbe) 中的按键,这个习惯像害怕空白页一样成为写作中固有的一部分。 然后这个习惯反过来害了他们。如果你在任何基于网页的编辑器中写作,按下保存快捷键组合后默认会发生的事情是弹出一个浏览器窗口——给你一个完全无用的选项来保存当前网站的HTML代码,并且常常通过一个缓慢、烦人的动画来宣布。 在很久以前,Medium也是如此: 然而,在某个时候,我们向编辑器添加了一点代码来让保存对话框消失: ``` if ((e.metaKey || e.ctrlKey) && e.keyCode === goog.events.KeyCodes.S) { this._editors.save() e.preventDefault() } ``` 这意味着:如果S与Command(`metaKey`,用于Macintosh)或Ctrl(用于Windows或Linux PC)一起按下,首先:提示我们的编辑器保存当前内容(尽管我们很快也会自动保存),其次:阻止通常发生的任何其他事情……本例中是烦人的浏览器保存对话框。 这感觉是正确的事情。(如果你愿意,你仍然可以从菜单中进入保存对话框。) 现在,如果你还记得开头提到的bug报告,这应该让你脑子里警铃大作: “我刚用波兰语开始写一篇文章。我可以打出所有字母,除了 Ś。当我按下 Ś 的键时,这个字母就是不出来。只有 Medium 上会出现这个问题。” 但有些东西对不上。Medium 在拦截CommandS和CtrlS,但你要输入 Ś 是按下的……AltS。 要让这两个世界相撞,我们只需要多一个原料。 ## 原料 4/4:Microsoft Windows Windows 3.x 和 95 都有极好的键盘支持。菜单项和对话框中的控件可以通过鼠标轻松访问……但也可以通过按下Alt和任何下划线字母来更快地访问: 大多数 Microsoft Windows 用户界面可以转化为一系列键盘按键,这非常强大——也是 Mac 仍然可以学习的地方。然而在波兰,Alt已经被普遍用于输入额外变音符号。这导致了冲突。幸运的是,到那时,键盘已经进化出额外的修饰键,包括空格键另一侧的第二个Alt键。 在欧洲的更定制化键盘上,这个键通常被称为Alt Gr,但波兰仍然主要进口英语键盘。 那么,如果我们保留Left Alt键用于Windows快捷键,但使用Right Alt键用于波兰语变音符号呢?那将解决所有问题(尽管通过两个修饰键实现更好人体工学的短暂胜利会再次失效……这次,单手按下Right Alt O、Right Alt L、Right Alt N会让手指处于字面意义上的不舒服位置)。 但是Right Alt功能也需要适用于只有一个Alt键的旧键盘,所以微软在内部将Windows中的Right Alt映射为一个很少使用的组合——同时按下Ctrl和Alt (http://web.archive.org/web/20260411054211/https://devblogs.microsoft.com/oldnewthing/20040329-00/?p=40003)。 这意味着,从系统角度来看,上述所有快捷键看起来是这样的: 这张图有些令人不安。那个CtrlAltS现在看起来很熟悉,对吧?实际上,它*极其*类似于我们曾经为了改进保存而拦截的CtrlS。 ## 修复 把所有这些放在一起,这个bug的原因就变得显而易见了: - 由于历史原因,波兰人使用Right Alt S来输入 Ś。 - 由于一个晦涩的技术决策,Right Alt S在内部被映射为CtrlAlt S。 - 由于习惯,人们有时可能会想按下CtrlS来保存文档。 - Medium 覆盖了按下CtrlS时的默认操作,以为这只是它在取消的浏览器保存对话框……并且从未意识到它可能是别的东西:字母 Ś。 - 因此,输入 Ś 变得不可能。 一旦我搞清楚了,补丁就很简单了。我们不是盲目且贪婪地拦截CtrlS,而是只在Alt键未被按下时拦截CtrlS: ``` if ((e.metaKey || (e.ctrlKey && !e.altKey)) && e.keyCode === goog.events.KeyCodes.S) { this._editors.save() e.preventDefault() } ``` 我们上周修复了这个问题,工作量不大。在看到了Medium上提交的bug报告,并记得添加了拦截CtrlS的功能后,我没费什么劲就搞清楚了。 但我恰好是波兰人,并且经历过上述所有事情——在我妈妈的打字机上学习盲打,拥有带美式键盘的早期PC,首先重写我的运动记忆以适应Left Alt,然后是Right Alt……并且在同样的运动记忆中,早早加入CtrlS,然后在我转用Mac时将其替换为CommandS。 自20世纪80年代以来,波兰改变了很多。1989年,共产主义垮台了。现在个人和公司都可以合法进口电脑。今天波兰的Windows和Mac机器都是新买的,完全支持波兰语,操作系统本身也得到适当的本地化。然而,如果你打开系统偏好设置,你仍然会看到程序员布局,它仍然是两者中最常用的。 对我来说,上面那几行代码可能是Medium代码库中最有趣的一个,是一系列偶然条件下的结果……今天它们被大量注释,以便后来人理解那个不透明的条件语句。 这些代码也是一段更大的故事的一部分——美国计算霸权的故事,其中如此之多的东西仍然围绕着相对简单的英语及其26个无重音字母的惯例发展。你忍不住会想,波兰语仍在为一点残羹冷炙而斗争,只被允许从一个QWERTY的复印衍生物转移到另一个——而许多其他语言甚至更不幸,它们的书写系统距英语更远。 这是一个微小的改变,但我感谢那些每天辛勤工作、花费更多时间的人们,让说这些语言的人能够良好地使用软件,而不会遇到带有英语偏见的假设、决策和例外情况。

相似文章

我最喜欢的Bug:无效的代理对

Hacker News Top

一篇博客文章,回顾了一个Bug:在CRDT库中,插入相邻的多字节表情符号导致了一个拼接操作,分割了代理对,并静默地破坏了协作编辑器的同步。

Unicode 字符串的等价性很奇怪 (2016)

Lobsters Hottest

Unicode 字符串等价性很复杂,尤其是涉及校对规则时,会导致意外的结果,例如删除控制字符和非确定性分组。作者讨论了在数据库系统中正确实现 Unicode 支持所面临的挑战。

重现 IBM Selectric Composer 字体(2023) --- 在寻找比普通打字机字体更精致的字体时,我发现自己深入研究了 IBM Selectric Composer 的历史——这是一台 20 世纪 60 年代末至 70 年代的排版机器,凭借其精良的字体和比例间距功能,曾广泛用于专业出版领域。 ## 背景 IBM Selectric Composer 是 IBM Selectric 打字机系列的一个特殊变体,专为专业排版而设计。它使用可互换的"字球"(typeball,也称为"golf ball"),能够产生比普通打字机更接近专业印刷品质的输出效果。这台机器支持多种字体和字号,并具备比例间距功能,使其输出的文档看起来更接近专业排版。 ## 字体特点 Selectric Composer 的字体具有以下几个显著特点: - **比例间距**:不同字符占用不同宽度,而非等宽 - **多种字号**:支持从 7 到 12 点不等的字号 - **多种字体风格**:包括衬线体、无衬线体等多种风格 - **专业品质**:输出质量介于普通打字机和专业照相排版之间 ## 数字化复原工作 复原这些字体的过程涉及以下几个步骤: 1. **收集样本**:从历史文档、用户手册和档案资料中收集原始字体样本 2. **扫描与清理**:对样本进行高分辨率扫描,并清理图像中的噪点和瑕疵 3. **矢量化**:将光栅图像转换为矢量轮廓 4. **调整与优化**:对字符进行细致的调整,确保一致性和可用性 5. **添加元数据**:为字体文件添加适当的元数据和字距调整信息 ## 技术挑战 复原过程中遇到了几个主要的技术挑战: - 原始样本质量参差不齐,许多文档经过多次复印,质量有所降低 - 比例间距信息需要从原始文档中重新推算 - 某些字符(尤其是标点符号和特殊字符)的样本极为稀少 - 需要在忠实还原原始设计与提高现代可用性之间取得平衡 ## 成果 经过数月的工作,成功复原了多款 Selectric Composer 字体的数字版本,这些字体现已可供免费下载使用。这些字体为设计师和排版爱好者提供了一种独特的历史风格选择,同时也为保存这段印刷史上的重要遗产做出了贡献。 ## 结语 这个项目不仅是一次技术练习,更是对印刷历史的一次致敬。IBM Selectric Composer 在专业出版领域扮演了重要角色,帮助无数人制作出超越普通打字机水平的专业文档。通过将这些字体数字化,我们得以将这段历史延续下去,让现代设计师也能感受到那个时代独特的排版美学。

Hacker News Top

设计师 Jens Kutilek 记录了复刻 IBM Selectric Composer 字体背后的数学与历史研究,深入探讨了这款标志性 1960 年代打字机所采用的单位间距系统及其工程设计约束。该项目涉及对 IBM 9 单位字形宽度系统的逆向工程——这一系统被 Selectric Composer 的可更换"高尔夫球"字球所采用。

逆境中的优秀字体

Hacker News Top

一篇探讨意外字体现象与工艺的文章,包括显示屏上的卷帘快门效应以及对字体局限性的创造性应用。