- Medium のウェブエディタで、ポーランド語の大文字 Ś だけが入力できなかったバグは、入力習慣、PC の輸入環境、保存ショートカットの習慣、Windows の Right Alt 処理方式が重なって発生した
- ポーランド語はラテンアルファベットに 9 個の発音区別符号付き文字を加えて使い、初期の PC 環境では専用キーボードの代わりに Alt+ラテン文字 の組み合わせを使う “programmer’s layout” が事実上の標準となった
- Windows が Right Alt を内部的に Ctrl+Alt のようにマッピングしていたため、Ś の入力に使われる Right Alt+S はシステム視点では Ctrl+Alt+S のように見えていた
- Medium はブラウザの保存ダイアログを防ぐために Ctrl+S を横取りして
preventDefault() を呼んでいたが、Alt の有無を確認していなかったため、文字入力そのものを妨げてしまっていた
- 修正は Ctrl+S を遮断する条件に
!e.altKey を追加する小さな変更であり、英語の 26 文字を中心にしたコンピューティング慣習が、他言語の利用者に例外や摩擦を生みうることを示している
Medium で消えた Ś
- あるユーザーが Medium でポーランド語の記事を書き始めた際、ほかの文字は入力できるのに Ś だけが入力できないと報告した
- Medium は特定の言語を特別扱いしておらず、ポーランド語 32 文字のうち、なぜこの 1 文字だけが問題になるのか、当初は奇妙に見えた
- 原因は単一機能の不具合ではなく、数十年にわたる 入力方式と OS の処理方式 が重なった結果だった
ポーランド語と追加文字
- ポーランド語はロシア語に次いで多く使われるスラブ語で、ウクライナ語よりも話者が多い
- ロシア語やウクライナ語と異なり、ポーランド語は英語/ラテンアルファベットを基盤にしつつ、いくつかの文字を追加している
- もともとポーランド語の単語には Q、V、X はないが、ラテン語や借用語のために維持されている
- その代わり、ラテン文字を基にした 9 個の発音区別符号付き文字 を追加で使う
- 20 世紀初頭のタイプライターはこれらの追加文字を収容する必要があり、一部の文字は専用キーを得たが、残りは数字キーと共有された
- 大文字はラテン文字を入力した後、バックスペースで戻ってアクセントを重ねる形で「シミュレーション」されることもあった
- 追加文字のスペースを確保するために、セミコロンや括弧のような句読点が犠牲になることもあった
共産圏ポーランドの PC 環境と programmer’s layout
- 1980 年代のポーランドにおける初期のパーソナルコンピュータ環境は、可処分所得の不足と西側コンピュータの商業輸入禁止という制約を抱えていた
- 西側から入ってきたコンピュータは、元のマニュアル、未翻訳のソフトウェア、米国式キーボードをそのまま備えていることが多かった
- フランスやドイツのような国はタイプライター配列を反映した専用キーボードを受け取ったが、ポーランドは米国式キーボードで 9 個の追加文字を入力する方法を見つけなければならなかった
- Ctrl はすでにショートカットとして広く使われ、Alt は比較的使われていなかったため、Alt の組み合わせが事実上の標準として定着した
- 8 個の発音区別符号付き文字は対応するラテン文字に割り当てられた
- 残る 1 文字は近い位置のキーに割り当てられた
- 既存の配列は “typist’s layout”、新方式は “programmer’s layout” と呼ばれた
- 初期の PC 利用者の多くがプログラマだったからかもしれない
- プログラミングで頻繁に使う句読点をそのまま維持したからかもしれない
- programmer’s layout は、左 Alt だけで近いキーを同じ手で押さなければならず、人間工学的に不便だったが、ハードウェア改造やステッカーなしで理解しやすかったため定着した
- その後、専用の typist’s keyboard が登場したが、ほとんど誰も切り替えず、あまり理想的ではない QWERTY が広く定着したのと似た流れを見せた
Ctrl+S の習慣とウェブエディタの衝突
- 自動保存が一般化する前は、文書を手動で保存する習慣が重要だった
- 1980〜1990 年代の保存処理は遅く、ディスクのような媒体を少しずつ摩耗させ、時には CPU を強く占有してほかの作業をしにくくした
- ユーザーは文章を書きながら、ひと息つくたびに Command+S または Ctrl+S を押す習慣を身につけた
- 段落ごとに押す人もいた
- 文ごとに押す人も、のちには数語ごとに押す人もいた
- ウェブベースのエディタでは、この習慣がブラウザの現在のウェブページ HTML 保存ダイアログを開いてしまう問題につながった
- Medium も過去にこれを防ぐため、エディタのコードで Ctrl+S または Command+S を検知して保存を呼び出し、既定動作を止めていた
if ((e.metaKey || e.ctrlKey) && e.keyCode === goog.events.KeyCodes.S) {
this._editors.save()
e.preventDefault()
}
- このコードは、Mac の
metaKey または Windows/Linux の ctrlKey と S が同時に押されるとエディタ保存を実行し、ブラウザの保存ダイアログを防ぐ
- 問題は、一部環境ではポーランド語の Ś 入力が単なる Alt+S には見えなかったことだった
Windows の Right Alt 処理方式
- Windows 3.x と Windows 95 では、メニュー項目やダイアログコントロールに Alt+下線付き文字 で素早くアクセスできた
- ポーランドでは Alt がすでに発音区別符号付き文字の入力に使われていたため、Windows ショートカットと衝突した
- キーボードが進化するにつれて、スペースバー右側に補助 Alt キーが追加され、左 Alt は Windows ショートカット用、右 Alt はポーランド語入力用に使う運用が可能になった
- しかし Right Alt の機能は、Alt キーが 1 つしかない古いキーボードでも利用できる必要があったため、Microsoft は Windows 内部で Right Alt を、あまり使われない Ctrl+Alt 同時入力 の組み合わせにマッピングした
- この決定により、ポーランド語の Ś 入力に使われる Right Alt+S は、システム視点では Ctrl+Alt+S のように見えるようになった
- Medium の Ctrl+S 遮断コードは Alt が同時に押されているか確認しておらず、その結果、Ś の入力を保存ショートカット遮断と同じように妨げてしまった
修正: Alt が押されているときは Ctrl+S とみなさない
- 原因が判明した後、修正は簡単だった
- Ctrl+S を無条件に遮断するのではなく、Ctrl が押されていても Alt が押されていないときだけ遮断するよう条件を変更した
if ((e.metaKey || (e.ctrlKey && !e.altKey)) && e.keyCode === goog.events.KeyCodes.S) {
this._editors.save()
e.preventDefault()
}
- 変更後、Right Alt+S の入力は Ctrl+S 保存遮断条件に引っかからなくなった
- Medium はこのバグを修正し、その条件式には後に人が理解できるよう多くのコメントが付けられることになった
小さな条件式の裏にある、より大きな問題
- ポーランドでは 1989 年に共産主義が崩壊し、現在ではコンピュータは個人も企業も合法的に輸入できる
- 現在ポーランドで購入する Windows と Mac はポーランド語を完全にサポートし、OS もローカライズされている
- それでもシステム設定には programmer’s layout が残っており、2 つの配列のうち最も一般的に使われる側であり続けている
- この小さなバグは、米国式コンピューティングの慣習が英語の アクセントのない 26 文字を中心に発展してきた現実とつながっている
- ポーランド語は QWERTY の派生配列の間を行き来しながら妥協してきたが、英語からさらに離れた文字体系を使う言語は、より不利な条件に置かれうる
1件のコメント
Hacker News の意見
ポーランド語がラテン文字を使い、追加の音価だけを小さなスラブ風の変形で表したおかげで、ポーランドは西側志向に合わせるのがずっと容易だったと思う。
平均的なポーランド人は、ウクライナ人やロシア人より西の隣人たちに文化的にはるかに近く、おそらく料理だけが例外かもしれない。
遠い将来、ウクライナも同じ道を行くのか気になる。
学者たちは、ほぼ同じ時期にポーランド語が独立した言語として発展し始めたと見ており、13世紀までは南の隣人たちと大きな問題なく意思疎通できていた。
15〜16世紀にポーランド語の正書法が形成され、スタニスワフ・ザボロフスキとヤン・コハノフスキは当時のポーランド語の音韻をより正確に反映するため文字を導入しようとしたが、彼らが提案したアルファベットはかなり長かった。
分割占領期には、ポーランド語と文化をなくそうとする強いロシア化があり、キリル文字導入の試みもあったが結局失敗した。当時の文学には愛国心や祖国愛をテーマにした作品が多かった。
1936年の言語改革で、今日知られている形に近づき、共産主義時代にはチェコ語・スロバキア語の vykání のように、公的な言葉遣いで二人称複数が導入されたが、不自然で政治色が強く、長続きしなかった。
ポーランド語には方言があるが、第二次世界大戦後の移住によって差が薄れ、標準ポーランド語もその時期に固まった。今日では英語からの借用語が増え、hater が hejter のように自然化することもある。
こう言うと、多くのポーランド人はかなり怒るだろう。
本当の問題は、ブラウザがキーの組み合わせを確認する簡単な方法を公開しておらず、開発者たちも自前で作っていないことにある。
多くのサイトでは、意図したキーの組み合わせが alt や shift のような追加の修飾キー付きでも実行されてしまう。
ここにあるコードも Windows でのより大きな問題を直すだけで、alt+cmd+s は依然として妨げられる。
ブラウザが keydown/up/press イベントに "CTRL+S"、"CTRL+ALT+S" のようなキー組み合わせコードを含むプロパティを公開する、という提案が必要だ。
そうすれば開発者はキーコードと修飾キーを自分で確認する代わりに、そのプロパティで分岐できる。
Web 開発者たちも、自分のコードの中でこうしたプロパティを自作し、修飾キーを直接検査する代わりに比較するようにするとよい。元記事のようなバグも防げるし、使うのもはるかに楽になる。
開発者がより簡単に介入できる選択肢をさらに多く持つようになったら、どれほど大きな被害を出せるか想像してみてほしい。
キーを横取りしなければならないなら、すでに低レベル API があるのだから、そこで止めておく方がいい。
一方で HTML にはショートカットキーを指定できる accesskey 属性がある: https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/...
新しい Copilot 365 もまさにこれだ。「Ć」を入力しようとするたびに Copilot が飛び出してきて、アプリを閉じ続けなければならない。
乗り換えてから一度も振り返っていない。
SteamOS で書いている。
ありがとう Microsoft。品質保証がうまく回っているのを見るのはうれしいですね。
面白い事実: Unicode の正準分解正規化を適用すると、ポーランド語の文字9個のうち8個(ż, ó, ć, ę, ś, ą, ź, ń)は基本文字 + 結合発音区別符号に分解されるが、ł はそのまま残る。
そのため sqlite の unicode61 remove_diacritics トークナイザーでは、ポーランド語テキストを全文検索用に正規化できない。
確かではないが、sqlite の remove_diacritics は、私が自分で実装した方法のように NCD に変換したあと、文字列から結合文字を取り除く方式なのだと思う。
ħ や ø のように分解されない他の特殊ケースも、同じように動作すると予想している。
Lviv = 250万人
Vinnytsia = 150万人
Ivano-Frankivsk = 130万人
Khmelnytskyi = 120万人
Rivne = 110万人
Ternopil = 100万人
Volyn = 100万人
Chernivtsi = 80万人
Zakarpattia = 80万人(ハンガリー系は除外)
これで、ウクライナ語話者が圧倒的な西ウクライナ人1,120万人となり、他の地域を完全に無視してもチェコ語話者数より多いです。しかも他の地域も完全なロシア語圏ではありませんでしたし、今はなおさら違います。
残念ながら、Mediumだけでなく、いくつかのWindowsアプリも同じです。たとえばActive Presenterでは、文字を1つ、おそらくÓを入力すると画面録画が止まってしまい、ポーランド語でタイピングする場面を録画できないことが多くなります。
他のアプリも同様に、Alt + Ctrl + 文字の組み合わせをショートカットに割り当てて、キーボードレイアウトドライバを何らかの形で上書きしているようです。
2026年になっても、突然Mac版Edgeで大文字のŚを入力できなくなりました。25年ほど過去に戻った気分です。
nvidia overlayにはAlt+Zショートカットがありますが、左Altと右Altの両方で動作するため、ポーランド語ユーザーはオーバーレイを開くかキーを再割り当てしないと「ż」を入力できず、かなり腹立たしいです。
Nvidia、どうか直してください。
要約するとこうです。
WindowsではすでにAltの組み合わせを使っていたため右Alt+sになり、右AltはWindows自体では使っていませんでしたが、別個の右Altコードの代わりにWindowsがそのキーをctrl+altの組み合わせとして書き換えてしまったのです。
要約するなら、少なくとも最も重要な細部は正確にすべきです。人々はAltだけを押していたのに、Windowsが「いまctrl+altを押している」と変換したため、alt+sがctrl+sのように見え、イベントを横取りして潰すときに誰も確認しないAltが付いてしまったのです。