
一个酝酿了三十年的键盘 bug几周前有人向 Medium 反馈刚开始用波兰语写文章时除了 “Ś” 之外其他字母都能正常输入。按下 “Ś” 对应的按键这个字母就是不显示且只有在 Medium 上才出现这种情况。这很奇怪因为并没有针对任何语言做特殊处理就算有在 32 个波兰字母中为何偏偏是 “Ś” 出问题呢事实证明这并非偶然。接下来将讲述四个跨越数十年甚至数百年的偶然因素如何共同导致这个离奇的 bug以及如何解决它。因素一波兰语波兰语是使用人数第二多的斯拉夫语仅次于俄语略多于乌克兰语。与俄语、乌克兰语不同和德语、法语等西欧语言类似波兰语使用的是经过一些调整的英语/拉丁字母。基础的英语字母表与经典的拉丁/罗马字母表基本相同。原始的波兰语单词中从不包含 Q、V 或 X但在拉丁语和其他外来词中会保留这些字母。作为交换波兰语在拉丁字母的基础上增加了 9 个变音符号字母这些字母在日常使用中较为常见。从 20 世纪初开始打字机需要适应这额外的 9 个字母。对比美国打字机和波兰打字机键盘右侧两个变音符号字母 “Ł” 和 “Ż” 有了独立的按键其余的则与数字共用按键。打字员被鼓励通过先输入拉丁字母再退格然后覆盖上重音符号来 “模拟” 正确的大写字母。在打字机时代这种操作并不少见。为了给额外的字母腾出空间打字机不得不舍弃一些标点符号最明显的是分号用逗号 退格 冒号代替和括号常用斜杠代替。因素二共产主义对于对 20 世纪 80 年代早期个人电脑感兴趣的人来说波兰的共产主义意味着两件事可支配收入不多禁止从西方商业进口电脑个人进口在有足够外汇和获取途径的情况下仍然可行。有人在波兰长大其第一台电脑——辉煌的 Atari 800XL是 1979 年的原装技术1983 年重新包装1986 年二手购入。这并非个例。铁幕另一边的技术发展滞后大多数电脑都是从西方进口的。商业进口禁令意味着很长一段时间内没有商业机构能为波兰用户准备好适用的电脑。进口的外国电脑带有原版说明书、未翻译的软件以及美式键盘。而法国、德国等国家的早期个人电脑配备了定制键盘其布局与之前的打字机非常相似。在波兰不得不另寻输入这 9 个独特变音符号字母的方法。这些额外字母看起来很像拉丁字母的对应形式在字母使用频率中仅占约 8%但很重要不能随意替换。肯定有办法解决这个问题。回到键盘不能对硬件做任何修改但可以尝试找到一个巧妙的解决方案。键盘上有两个修饰键——Ctrl现在 Caps Lock 的位置和 Alt。Ctrl 即使在 CtrlC 和 CtrlV 成为复制粘贴的常用快捷键之前就已经被用作常用快捷键了。而 Alt 相对使用较少。于是一个事实上的标准诞生了将 8 个变音符号字母与它们对应的拉丁字母关联起来另一个则关联到附近的键位。人们开始把旧的布局称为 “打字员布局”新的称为 “程序员布局”这可能是因为早期的个人电脑用户大多是程序员也可能是因为它保留了编程中常用的所有标点符号。新布局在人体工程学上是一场噩梦但它易于理解也不需要任何昂贵的硬件修改甚至连便宜的贴纸都不用。这个布局就这样流传了下来。其他一些周边国家如罗马尼亚、当时的捷克斯洛伐克也采用了类似的方案。这个方案非常成功以至于十年后当合适的打字员键盘开始出现时几乎没人愿意切换就像大约 80 年前不理想的 QWERTY 键盘占据主导地位一样。因素三旧习惯难改如今常见的自动保存功能在当时需要等待合适的时机。特别是在 20 世纪 80 年代甚至 90 年代保存文档是个漫长的过程还会慢慢损耗存储介质有时甚至会占用大量 CPU 资源导致电脑无法做其他事情。手动保存就像如今的备份一样是为了自身利益必须养成的习惯。那些不幸的人吃了苦头才明白这个道理他们在一台经常崩溃的电脑上写了几个小时最后才发现忘记保存。有人就是其中之一。大家都学会了在停顿的时候按下 CommandS 或 CtrlS。有时是每段结束后经常是每句结束后后来甚至是每打几个字就按一次。CtrlS 成了人们肌肉记忆中的一部分就像害怕空白页面一样成为写作的一部分。然而这个习惯后来却带来了问题。在任何基于网页的编辑器中按下保存快捷键后默认会弹出一个浏览器窗口让你保存当前网站的 HTML 代码而且通常还会伴随着缓慢、恼人的动画。Medium 很久以前也是如此。不过后来在编辑器中添加了一段代码让保存对话框不再弹出。这段代码的意思是如果按下 S 键的同时按下了 CommandMac 系统使用的 metaKey或 CtrlWindows 或 Linux 系统使用首先提示编辑器保存当前内容其次阻止其他默认操作也就是那个恼人的浏览器保存对话框。现在回顾开头提到的 bug 报告就会发现问题所在“我刚开始用波兰语写文章除了 ‘Ś’ 之外其他字母都能正常输入。按下 ‘Ś’ 对应的按键时这个字母就是不显示而且只有在 Medium 上才会出现这种情况。”这似乎不太合理。Medium 屏蔽的是 CommandS 和 CtrlS但输入 “Ś” 需要按下 AltS。要让这两个问题产生关联还需要最后一个因素。因素四微软 WindowsWindows 3.x 和 95 都有出色的键盘支持。菜单和对话框中的控件不仅可以用鼠标轻松操作还可以通过按下 Alt 和下划线字母更快地访问。微软 Windows 的大部分用户界面都可以通过键盘操作这非常强大苹果系统至今仍可从中学习。然而在波兰Alt 已经被广泛用于输入额外的变音符号字母这就产生了冲突。幸运的是那时键盘已经发展出了额外的修饰键包括空格键另一侧的第二个 Alt 键。在欧洲的一些定制键盘上这个键通常被称为 Alt Gr但波兰主要还是进口美式键盘。那么如果把左 Alt 键用于 Windows 快捷键右 Alt 键用于输入波兰语变音符号字母问题不就解决了吗虽然通过两个修饰键实现更好人体工程学的短暂胜利又会被打破……这次是单手操作右 AltO、右 AltL 和右 AltN会让手指处于非常不舒服的位置。但对于只有一个 Alt 键的旧键盘也需要支持右 Alt 的功能所以微软在 Windows 系统内部将右 Alt 映射为很少使用的 CtrlAlt 组合键。这意味着从系统的角度来看所有这些快捷键看起来是这样的。CtrlAltS 看起来很眼熟实际上它和为了改进保存功能而屏蔽的 CtrlS 极其相似。解决方案综合以上因素bug 的原因就很明显了由于历史原因波兰人使用右 AltS 输入 “Ś”由于一个不太为人知的技术决策右 AltS 在系统内部被映射为 CtrlAltS出于习惯人们有时会按下 CtrlS 来保存文档Medium 盲目地屏蔽了 CtrlS以为只是在取消浏览器的保存对话框却没有意识到它可能是输入字母 “Ś” 的组合键因此无法输入 “Ś”。弄清楚原因后修复起来就很简单了。不再盲目地屏蔽 CtrlS而是只在没有按下 Alt 键时屏蔽 CtrlS。上周修复了这个问题工作量并不大。看到 Medium 上的 bug 报告后想起了添加屏蔽 CtrlS 功能的事很快就找到了问题所在。不过恰好是波兰人经历了上述所有情况——在妈妈的打字机上学习盲打使用带有美式键盘的早期个人电脑先适应左 Alt 键再适应右 Alt 键……在肌肉记忆中先记住了 CtrlS后来换成 Mac 后又换成了 CommandS。自 20 世纪 80 年代以来波兰发生了很大的变化。1989 年共产主义结束。如今个人和公司都可以合法进口电脑。现在波兰的 Windows 和 Mac 电脑都是全新购买的完全支持波兰语操作系统也进行了适当的本地化。不过打开系统偏好设置仍然可以看到 “程序员布局”而且它仍然是两种布局中最常用的。对来说上面这几行代码可能是 Medium 代码库中最奇特的部分之一是一系列偶然因素的结果。如今对其进行了详细注释以便后来的人能理解这个不太容易理解的条件语句。这些代码也是美国计算机霸权更大故事的一部分很多东西仍然围绕着相对简单的英语展开英语只有 26 个无重音字母。不禁让人觉得波兰语仍在为生存而挣扎只能从一种 QWERTY 键盘的变体换到另一种。而其他很多语言则更不幸它们的书写系统与英语相差甚远。这只是一个小改动但很感激那些每天辛勤工作的人他们花了很多时间让使用这些语言的人能够顺利使用软件而不会遇到带有英语思维的假设、决策和特殊情况。更多键盘故事原始的折磨板我不知道苹果对 Fn/地球键的最终计划是什么我不确定苹果自己是否知道键盘趣事简史45 分钟