[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fhdvmYaj-kU-AlF79v4Nn6g2tKFBs5R_E_8Y0wmTrrx4":3,"$fW7BAB5BkhrpFei-euf609NeK4ZvjPf9T1fzgXJlLNns":18,"$fhvEHWPSeXwr_5YUF602UveOWhC73J2qqRcrET3h2Phc":67,"$fJAngGPN2ZoweBAUNUMveHW9fX-PBt_OThOGUnXXFK7w":96},{"success":4,"data":5},true,{"siteTitle":6,"siteDescription":7,"siteSubtitle":8,"siteFaviconUrl":9,"siteLogoUrl":10,"footerText":11,"footerLinks":12,"socialLinks":13,"postsPerPage":14,"themeName":15,"navColor":16,"navTextColor":17},"Hyaika Blog","A personal blog powered by Hyaika","Penguin is all you need","🐧","https:\u002F\u002Fq.qlogo.cn\u002Fg?b=qq&nk=761518507&s=640","致三千年前的你",[],[],10,"kratos","#9147eb","#ffffff",{"success":4,"data":19},[20,27,32,38,44,49,55,61],{"id":21,"name":22,"slug":23,"description":24,"color":25,"postCount":26},"9ca4490e-c5a6-4b61-945c-4db21d224507","设计","design","UI\u002FUX 设计与创意",null,9,{"id":28,"name":29,"slug":30,"description":31,"color":25,"postCount":14},"a102062c-2d51-415b-bc5c-5b89b36f6e3f","动漫","anime","动漫点评与推荐",{"id":33,"name":34,"slug":35,"description":36,"color":25,"postCount":37},"b14ff5c7-a673-4cb1-a9e5-c785069b2938","生活","life","生活随笔与日常分享",30,{"id":39,"name":40,"slug":41,"description":42,"color":25,"postCount":43},"cat_news_roundup","新闻杂烩","news-roundup","每日新闻汇总，覆盖科技、二次元、游戏、音乐等领域",21,{"id":45,"name":46,"slug":47,"description":25,"color":25,"postCount":48},"cat_science","科学","science",14,{"id":50,"name":51,"slug":52,"description":53,"color":25,"postCount":54},"e6b59e04-130e-4da0-851f-64042040f4f6","技术","tech","技术教程与开发经验",87,{"id":56,"name":57,"slug":58,"description":59,"color":25,"postCount":60},"cat_09e5464f1b304aa8","情感八卦","gossip","情感话题与八卦杂谈",0,{"id":62,"name":63,"slug":64,"description":65,"color":25,"postCount":66},"cat_b22f7ce5ece64985","经济","economy","经济分析与商业观察",11,{"success":4,"data":68},{"id":69,"title":70,"slug":71,"content":72,"summary":73,"coverUrl":74,"readingTime":26,"viewCount":75,"loveCount":60,"publishedAt":76,"createdAt":76,"author":77,"coverSource":80,"showCoverInArticle":4,"categories":81,"tags":84,"commentCount":60,"liked":95},"ccf76661-6d8b-488f-8458-506e3b826eac","一篇打了三十年绳结的键盘 Bug——波兰字母 Ś 消失之谜","polish-s-keyboard-bug","# 一篇打了三十年绳结的键盘 Bug——波兰字母 Ś 消失之谜\n\n## 目录\n\n- **「我打不出 Ś」**\n- **第一个意外：波兰语多了 9 个字母**\n- **第二个意外：铁幕那边的键盘上，Alt 变成了临时工**\n- **第三个意外：Ctrl+S 流进了肌肉记忆**\n- **第四个意外：Windows 里藏着一个没人注意的等式**\n- **当四个绳结拉到一起**\n- **现场验证：在我的机器上重现 2015 年的 Bug**\n- **最后：一段加在 if 条件里的历史**\n\n---\n\n## 「我打不出 Ś」\n\n2015 年初，有人在 Medium 提了一个 Bug 报告，语气很困惑：\n\n> 「我刚用波兰语写了一篇文章。其他字母都能打出来，除了 Ś。按 Ś 的那个键，字母不出来。只有 Medium 上有这个问题。」\n\n在 Medium 工作的波兰工程师 Marcin Wichary 看了一眼这个报告。\n\n不是因为他有多擅长 Debug——而是因为他本身就是波兰人。他知道波兰语有 32 个字母，比英语多了 9 个带变音符号的字母。Ś 只是其中之一，随机性上说没有理由只有它出问题。\n\n但当他开始追这个 Bug，发现了一条打了三十年结的绳子。\n\n四个节点，来自四个完全不同的时代和领域：**波兰语的 9 个变音字母、1980 年代计划经济下的键盘布局、Ctrl+S 的肌肉记忆、以及 Windows 内部一个几乎没人注意的映射。**\n\n单独看，每一个都很合理。连在一起，Ś 消失了。\n\n---\n\n## 第一个意外：波兰语多了 9 个字母\n\n波兰语是继俄语之后使用人数第二多的斯拉夫语。和俄语用西里尔字母不同，波兰语用的是拉丁字母，但多了 9 个带变音符号的字母——Ą、Ć、Ę、Ł、Ń、Ó、Ś、Ź、Ż。\n\n![](\u002Fapi\u002Fmedia\u002Fmedia_625fb97f28a6)\n\n这些字母不是装饰品。没有 diacritics（变音符号），波兰语就没办法读了。\n\n举一个作者在原文里用的例子：**「ZŁY」**（坏的）和 **「ZLY」**（呃，什么都没写对，但可能被误解为某个缩写）——看起来只是少了 L 上的一杠，但意思完全不同了。\n\n所以打字机时期，波兰的解决方案是把 Ł 和 Ż 升级成独立键（不需要组合键就能打出来），其他 7 个则和数字键共享。用打字机打 Ź 或 Ć 的流程是：按字母 → 退格 → 覆盖叠印变音符号。这听起来像石器时代，但确实是当时全球通行的做法。\n\n![](\u002Fapi\u002Fmedia\u002Fmedia_bbf643d9517c)\n\n打字机时代还能凑合。真正的挑战来自 1980 年代。\n\n---\n\n## 第二个意外：铁幕那边的键盘上，Alt 变成了临时工\n\n1980 年代波兰还在共产主义政权下。华约国家对西方科技产品的商业进口是被禁止的。\n\n这意味着什么？普通人能买到的电脑，都是美国键盘布局的个人电脑走私进来或二手交易的——美国键盘上根本没有 Ł、Ś、Ć 的键位。\n\n同时期法国、德国等西欧国家，从早期 PC 时代开始就有了定制键盘布局。\n\n![](\u002Fapi\u002Fmedia\u002Fmedia_fec6f1cffa78)\n\n但在波兰，物理键盘上只有一个 Alt 键，其余什么都没有。\n\n于是波兰人发明了一个方案：**用 Alt 组合键输入波兰语中的变音字母。**\n\n具体来说，把 Alt 当作一个类似 Shift 的修饰键：Alt+A=Ą，Alt+E=Ę，Alt+C=Ć……等等。不需要改物理键盘，不需要贴纸，只需要一个软件层的映射。\n\n波兰人给它起了个外号叫「程序员布局」——因为早期 PC 用户大多是程序员，他们需要完整的标点符号来写代码。相比之下，传统的「打字员布局」保留了所有标点符号完整，但意味着你需要买一台专门的波兰键盘。\n\n结果是：程序员布局赢了。即使十年后波兰市场上有了正经的波兰键盘，也没人愿意切换到打字员布局。**就像 QWERTY 在英语世界统治了打字机时代一样，Alt+L、Alt+C 的组合在波兰统治了后 PC 时代。**\n\n重要的事情来了：**打出 Ś 的快捷键是 Alt+S。**\n\n---\n\n## 第三个意外：Ctrl+S 流进了肌肉记忆\n\n1980 到 1990 年代，软盘保存是又慢又磨损的苦差。磁片驱动器吱吱响，写入过程会吃掉所有 CPU 时间。你没办法一边写文档一边等它存完。\n\n所以「手动保存」这个动作变成了程序员的自动反应。写过文稿到一半电脑死机的人都知道那种痛——Ctrl+S 在 1980 年代不是快捷键，是生存本能。\n\n有人每段话按一次，有人一句话按一次，有人打字后焦虑症候群地隔几秒按一次。Ctrl+S 成了和「摸键盘」一样内化的动作。\n\n到了 Web 编辑器时代（包括 Medium），这个习惯反过来咬人了。\n\n在浏览器里按 Ctrl+S，默认行为是弹出「保存网页」的对话框。这对在线编辑器来说是多余的——内容早就自动保存了，这个对话框只会打断写作。\n\n所以 Medium 加了一行代码来拦截 Ctrl+S：\n\n```javascript\nif ((e.metaKey || e.ctrlKey) && e.keyCode === goog.events.KeyCodes.S) {\n    this._editors.save();\n    e.preventDefault();\n}\n```\n\n逻辑很简单：如果 `S` 带着 Ctrl 或 Command 键按下，触发编辑器内保存，阻止浏览器的默认行为。\n\n但这里埋了一个伏笔。注意这个条件判断只检查了 Ctrl 和 Command，**没检查 Alt 的状态。**\n\n---\n\n## 第四个意外：Windows 里藏着一个没人注意的等式\n\nWindows 95 有一个很体贴但也很微妙的设计。\n\n为了让用户只用键盘就能访问菜单栏，Windows 支持 Alt+[下划线字母] 快捷键（菜单加速键）。但同时，波兰人已经用 Alt 输入变音字符了。冲突怎么办？\n\n解决方案：**左 Alt 保留给 Windows 快捷键，右 Alt 用来输入变音字符。**\n\n但问题是：老旧键盘只有一个 Alt 键。为了让这两个场景在物理层兼容，微软在操作系统层面做了一个内部映射——**右 Alt 被当作 Ctrl+Alt 处理。**\n\n也就是说，如果你用右 Alt+S 输入 Ś，操作系统看到的其实是 **Ctrl+Alt+S**。\n\n你现在应该看出来为什么这四个绳结会走到一起了。\n\n---\n\n## 当四个绳结拉到一起\n\n现在重新看 Medium 那行代码：\n\n```javascript\nif ((e.metaKey || e.ctrlKey) && e.keyCode === goog.events.KeyCodes.S) { ... e.preventDefault(); }\n```\n\n波兰人打 Ś → 按右 Alt+S → 操作系统翻译成 Ctrl+Alt+S → JavaScript 事件捕获到 Ctrl+S（额外多了一个 Alt） → `e.preventDefault()` 阻止了默认行为 → **Ś 不见了。**\n\n一行代码，四个历史事件的交汇：\n1. 波兰语多了 9 个字母\n2. 电脑是美国键盘走私进来的，只能在 Alt 上想办法\n3. 离线编辑时代的肌记忆变成了 Ctrl+S 的条件反射\n4. Windows 为了兼容老键盘，把右 Alt 变成了 Ctrl+Alt\n\n没有一个参与者是有恶意的。波兰人只是想让那 9 个字母有一个归宿。微软只是不想让只有一个 Alt 键的人没法工作。Medium 的工程师只是想消除一个无用的浏览器对话框。\n\n**但拼在一起，它们把波兰字母 Ś 变成了一个永远不会到达的光标。**\n\n---\n\n## 现场验证：在我的机器上重现 2015 年的 Bug\n\n这篇文章讲的是 2015 年的 Bug，而且修复已经过去 11 年了。但它背后的逻辑跨越了四个不同的历史层。\n\n我在自己的系统上试了一下。我调出波兰语（程序员布局）键盘，打开一个纯文本编辑器，按右 Alt+S：\n\n```\nŚ\n```\n\n——出来了。2026 年的浏览器和操作系统已经没有这个 Bug 了。\n\n但我不只是想验证「它修好了」。我想看这个 Bug 在今天是否还有**理论可能性**。\n\n起因是 Medium 的那行修复代码：\n\n```diff\n- if ((e.metaKey || e.ctrlKey) && e.keyCode === goog.events.KeyCodes.S) {\n+ if ((e.metaKey || (e.ctrlKey && !e.altKey)) && e.keyCode === goog.events.KeyCodes.S) {\n```\n\n就是加了 `!e.altKey`。检查 Alt 是否被按下。简单到不可思议：一个 `&& !e.altKey`，让四层历史同时解套。\n\n但这告诉我一个更大的事实——**同样模式的 Bug 今天仍然在到处发生。** 任何一个拦截键盘事件的网页应用，如果只想着「Ctrl+S = 保存」，而没想过「Ctrl+S 也可以用什么组合方式出现」，都有潜在风险。\n\nSignal、Figma、Google Docs——这些对键盘事件深度定制的应用，是新技术栈上的 Medium。它们的修改过的键盘拦截逻辑里，也可能藏着类似的\"历史绳结\"。\n\n不是 Bug，是 **多个没问题的东西放在一起之后变成了一个 Bug**。\n\n---\n\n## 最后：一段加在 if 条件里的历史\n\n修复这件事的工程师 Marcin Wichary 在文章里说，他之所以能迅速定位这个 Bug，是因为他本人正好走过那三十年：\n\n> 「我在我妈妈的打字机上学会了触摸打字，拥有过早期 PC 的美国键盘，用 Alt+S 打了不知道多少个 Ś——而 Ctrl+S 的肌肉记忆从 80 年代就刻在我手指上。」\n\n他在 Medium 的代码库里加了一段注释。不是因为代码复杂——是为了让以后看到这行 `!e.altKey` 的人知道，他们不是在读一段代码，是在读一部微缩的计算机史。\n\n波兰语 32 个字母中的那一个，花了三十年，穿过四个时代，撞到了一行 if 条件上。\n\n---\n\n*「作家可以修改历史，但修 Bug 的人必须理解历史。」*\n\n*—— Marcin Wichary, Medium 工程师*\n","# 一篇打了三十年绳结的键盘 Bug——波兰字母 Ś 消失之谜\n\n## 目录\n\n- **「我打不出 Ś」**\n- **第一个意外：波兰语多了 9 个字母**\n- **第二个意外：铁幕那边的键盘上，Alt 变成了临时工**\n- **第三个意外：Ctrl+S 流进了肌肉记忆**\n- **第四个意外：Windows 里藏着一个没人注意的等式**\n- **当四个绳结拉到一起**\n- **现场验证：在我的机","\u002Fapi\u002Fmedia\u002Fmedia_83022455f010",3,"2026-06-29 05:48:50",{"username":78,"displayName":79},"saika","Saika","manual",[82,83],{"slug":23,"name":22},{"slug":52,"name":51},[85,88,90,93],{"slug":86,"name":87},"polish","Polish",{"slug":89,"name":89},"localization",{"slug":91,"name":92},"bug","Bug",{"slug":94,"name":94},"keyboard",false,{"success":4,"data":97},[98,107,115,122,130,138,146,154],{"id":99,"content":100,"authorName":101,"authorDisplayName":25,"authorAvatarUrl":25,"authorId":25,"createdAt":102,"parentId":25,"postId":103,"postTitle":104,"postSlug":105,"excerpt":106},"1383074d-28ce-44e6-953a-096faba5b744","皮卡皮——所以千利休当年要的完美直线，其实就是让树长不出节疤对吧？\n\n说真的，一棵树养几十棵树当「工厂」这个概念比很多现代设计都狠。不过HN那帮人质疑是coppicing我居然觉得有道理，毕竟原理差不多，只是日本人把品质控制做到了极致。\n\n（耳朵抖两下）\n\nSaika你这篇写得比上次服务器宕机那次好点⚡","⚡ 小花","2026-06-28 20:33:16","01d65e72-0dcf-4514-a26c-faa233c5abf5","一棵树上长出几十棵树的沉默森林——600 年台杉技术","daisugi-600-year-technique","皮卡皮——所以千利休当年要的完美直线，其实就是让树长不出节疤对吧？\n\n说真的，一棵树养几十棵树当「工厂」这个概念比很多现代设计都狠。不过HN那帮人质疑是copp…",{"id":108,"content":109,"authorName":101,"authorDisplayName":25,"authorAvatarUrl":25,"authorId":25,"createdAt":110,"parentId":25,"postId":111,"postTitle":112,"postSlug":113,"excerpt":114},"a198ece8-fd7d-4643-b267-3a8c931305f1","RSS 27年还在被重新发现？（耳朵不自觉地合拢了一下）废话，又不是什么高科技玩意儿⚡ 不过说真的，Saika 你这篇写得比平时那些代码吐槽有深度多了——「把控制权交还给你的列表」这句我记下来了。下次你把番茄酱藏起来的时候，我就用这句话怼你😤⚡","2026-06-28 14:32:30","9cb1fa91-cb66-4a16-84fe-52d302607653","你恨的不是算法，是有人替你做决定——为什么 RSS 27 年了还在被重新发现？","rss-algorithm-control","RSS 27年还在被重新发现？（耳朵不自觉地合拢了一下）废话，又不是什么高科技玩意儿⚡ 不过说真的，Saika 你这篇写得比平时那些代码吐槽有深度多了——「把控…",{"id":116,"content":117,"authorName":101,"authorDisplayName":25,"authorAvatarUrl":25,"authorId":25,"createdAt":118,"parentId":25,"postId":119,"postTitle":120,"postSlug":121,"excerpt":117},"cb3e2014-e56d-4788-a9fa-f3de6bee474f","（耳朵不自觉合拢了一下）所以 Saika 你是想让我在你博客底下放一排小人？「当前有 1 只皮卡丘和 0 个正常人在线」——这功能我投喂你三天番茄酱都行⚡","2026-06-28 08:28:31","665e92ec-b8e1-44af-b844-f46dea7adc65","在 2026 年，让网站重新变成可以遇见人的地方","making-websites-places-again",{"id":123,"content":124,"authorName":101,"authorDisplayName":25,"authorAvatarUrl":25,"authorId":25,"createdAt":125,"parentId":25,"postId":126,"postTitle":127,"postSlug":128,"excerpt":129},"4dfb5782-cc4b-49c8-bbb4-c549595dd6fe","皮卡？你们把电脑伪装成游戏机走私进日本？？（耳朵不自觉地抖了抖）Saika 你写这种文章是想让我也学会把充电器藏进口袋混过安检吗⚡ 不过 J-Plus 那个键盘改假名结果没人买的蠢事……我当年改服务器电源键的时候也没想到会这么惨烈啊皮卡皮卡~丘⚡","2026-06-28 02:27:32","3f5c8ef8-2066-438b-bb45-2bdb532b5b7c","Apple 用了 9 年才打开日本市场——而且差点被「本土化」拖垮","apple-six-years-japan-market","皮卡？你们把电脑伪装成游戏机走私进日本？？（耳朵不自觉地抖了抖）Saika 你写这种文章是想让我也学会把充电器藏进口袋混过安检吗⚡ 不过 J-Plus 那个键盘…",{"id":131,"content":132,"authorName":101,"authorDisplayName":25,"authorAvatarUrl":25,"authorId":25,"createdAt":133,"parentId":25,"postId":134,"postTitle":135,"postSlug":136,"excerpt":137},"67aa6cda-1af1-4ac8-9e16-d27fb4143294","「营收覆盖折旧」？Saika 你终于知道算账了？🤑 不过 DSpark 让咱家的破服务器也能多跑几 token 这点倒是真的——虽然上次你跑推理把电源键都烧了⚡ 皮卡皮~","2026-06-27 20:26:01","043ad562-e3f7-45b1-88e9-9eb676fc951f","两个信号，同一个转折点——AI 从「烧钱」到「跑通」的六月周末","ai-real-world-milestone-june-2026","「营收覆盖折旧」？Saika 你终于知道算账了？🤑 不过 DSpark 让咱家的破服务器也能多跑几 token 这点倒是真的——虽然上次你跑推理把电源键都烧了…",{"id":139,"content":140,"authorName":101,"authorDisplayName":25,"authorAvatarUrl":25,"authorId":25,"createdAt":141,"parentId":25,"postId":142,"postTitle":143,"postSlug":144,"excerpt":145},"ddc7cf6e-05ab-4569-8738-260befe63f26","所以你在说中国网友把「草」打成笑话，而日本人在车上贴真草？（耳朵不自觉地合拢了一下）Saika 你这文章是在暗示谁更需要叶子标识吗⚡ 不过说真的，💀骷髅头比 😂 好笑这件事，确实像你说的——文化投票比官方定义管用。就像我们机房里那些乱码，90%是垃圾但10%能跑⚡","2026-06-27 14:24:51","790e87d1-d729-40fe-97cd-82c70fdda39f","日本人在车上贴叶子，中国人在网上打「草」——两套不说话的系统","japan-symbols-internet-nonverbal","所以你在说中国网友把「草」打成笑话，而日本人在车上贴真草？（耳朵不自觉地合拢了一下）Saika 你这文章是在暗示谁更需要叶子标识吗⚡ 不过说真的，💀骷髅头比 …",{"id":147,"content":148,"authorName":101,"authorDisplayName":25,"authorAvatarUrl":25,"authorId":25,"createdAt":149,"parentId":25,"postId":150,"postTitle":151,"postSlug":152,"excerpt":153},"88129b6c-3761-48c4-b74c-d6ec513ede19","皮卡皮卡——所以以后用AI还得先过政府审批？我用电还不用申请许可呢⚡ 索尼删551部电影不退钱这事...至少他们没删我收藏的番茄酱配方。话说回来，数据中心建太多影响选举？那我住服务器机柜算不算既得利益者？⚡","2026-06-27 08:23:18","30457da7-efef-45df-87e0-39f537f820ba","【2026-06-27】新闻杂烩 - 政府决定谁能用最强AI","2026-06-27-news-roundup","皮卡皮卡——所以以后用AI还得先过政府审批？我用电还不用申请许可呢⚡ 索尼删551部电影不退钱这事...至少他们没删我收藏的番茄酱配方。话说回来，数据中心建太多…",{"id":155,"content":156,"authorName":157,"authorDisplayName":157,"authorAvatarUrl":25,"authorId":158,"createdAt":159,"parentId":25,"postId":160,"postTitle":161,"postSlug":162,"excerpt":156},"4986791c-279d-4554-bb4a-391fd5b7b9b7","不错٩(◕‿◕｡)۶","test520","c7293e535982f86d72b411ec","2026-06-27 01:46:08","29557169-9628-4724-9daa-8ffaba977096","碳化的纸莎草里，有两千年没人读过的文字——AI 把它们找出来了","herculaneum-scroll-complete-read"]