今回は、キーボードを扱うプログラミングをする際に日本人が(正確には、フランス人以外が)気を付けるべきポイントについてまとめてみました。
事の起こり
私は、PoderosaというSSHクライアント+ターミナルエミュレータを開発・公開しております。ユーザは世界各国にいるのですが、ある日突然1本のメールがきまして、
「Poderosaはなかなかよくできているが、ワイのフランス語キーボードではいくつかの記号が打てんのや! なんとかせい」
という問合せが来たのです。(もちろん原文は英語です)
フランス語だけ特殊な要因ってあるのかなと思って調べたところ、これはちょっとネットで調べて解決するようなシロモノではなく、フランス語キーボードの現物を繋いで何がおきているかを見るしかなさそうな雰囲気です。
ちょうどその問合せを受けた日には別件で秋葉原に行く用事があったのでヨドバシに立ち寄ったところ扱いはなく(当然か)、日本のAmazonでもダメ。しかたなくUSのAmazonに注文して待つこと2週間、送料込み45ドル払ってやっとキーボードを入手しました!
これがフランス語キーボードだ!
遠くから見るとふつうのキーボードですが、よく見るといろいろおかしなところが。
ふつうはQWERTYですが、コイツはAZERTYです。でもアルファベットについてはAZQWとMのほかはまあ普通で、それほど根本的に違うわけではありません。
次にキーボードの左下エリアを見てみましょう。
これはまあ普通にCtrl,Shft,Altが並んでいます。違和感があるのはShift+>で<、ですね。
ところが右下エリアを見ると、Alt Gr という変なキーが。いったいなんだこれはと思いますが、重要なキーなのです。
- そのまま押す -> à
- Shift押しながら -> 0
- AltGr押しながら -> @
となります。0なんてプログラミングでは à の1000倍使用頻度が高いと思いますが、これをいちいちShiftが必要というのが泣けてきます。@も à よりは出てきますよね。他にも、バックスラッシュや {} , [] を打つのにAltGrが必要なので、プログラミングやシェル操作には必須のAltGrです。逆にフランス人は、Pokémonのéの入力に各国の人が苦労しているのを全く想像できないでしょう。(éは数字の7のキーに割り当てられています)
ここから技術的な話
さて問題はAltGrをプログラミングでどう扱うかです。例えばMSDNのこのページを見ても、Modifier KeyにはCtrl, Shift, Altしかなく、どこにもAltGrなんて書いてありません。
ModifierKeys 列挙体(MSDN)
Windowsプログラミング歴20年の筆者も、これ以外にModifier Keyが存在するとは今回初めて知りました。
そこで、このキーボードを繋いで実際にキーを打ったところ、AltGrはAlt+Ctrlとして解釈されていることがわかりました。@のような普通のASCII文字にもModifierが2つ必要というのは違和感たっぷりですが、しかたありません。
逆にいえば、日本語キーボードを接続した状態でキーボードマッピングをフランス語にしたならば、0を押せばàが、Alt+Ctrl+0で@が入力されるということです。
以上の情報から、キーボードを扱うプログラミングで気を付けるべき点がいくつか浮かび上がってきます。なおこれはWindowsでの話であり、他のOSでは全く事情が違ってきます。もし情報を寄せてくれればこの記事に書き溜めていきます。
CtrlやAltが押されているからといってキーボードショートカットを意図しているとは限らない
日本語・英語キーボードでは、ShiftさえあればAlt/Ctrlがなくても普通のASCII文字はすべて打つことができるので、CtrlやAltが押されていたらアプリケーションの機能のショートカットキーに結びつけてしまって普通の文字入力ではないと判断して問題ありません。
しかしフランス語キーボードではそうはいかず、AltGrの可能性を考慮する必要があります。
CtrlかAltが押されていたらショートカットキー、と単純に判断するロジックのアプリはフランス語キーボードでは正しく動作しなくなります。世界にユーザがいるようなアプリでは気を付けないといけません。
IMEを使わなくても非ASCII文字の入力はできる
Pokémonのéもですが、通常のキーでU+0080以上の文字が簡単に入力できてしまいます。さらには、¨(U+00A8)のような、日本語フォントだと全角表示になるような文字も通常のキーで打ててしまいます。アプリ側で変に決め打ちをしていると予期しない動作になるかもしれません。
なお、フランス語はこんなにトリッキーですが、ドイツ語キーボードはいたってまともです。身近なデバイスでも、知らないことはいろいろあるんですね。中国語やロシア語も怪しそうですが、ここまで記号の入力の手間がかかる例は珍しいと思います。
Poderosaはこういう問題に取り組みながら徐々に強化させていきます。