Canadian Multilingual Standard キーボード配列で、[RightCtrl]+[.] に続けて [Z] キーを押したとき、 U+017C : ż が予期されるのにU+0017 が生成される。
追記: これは、この記事が作成された2008年時点での不具合で、その後、修正されたようだ。
[RightCtrl] を使った拡張シフト(現在、このキーボード配列でのみ使用)についても略述。
このキーボード配列では [右Ctrl]+[.] が「上に点」のアクセント記号 U+02D9 [ ˙ ] のためのデッドキー(注1)で、 続けて c e g などをタイプすると、上に点がついた ċ ė ġ などが入力できる。 また [Shift] を押しながら大文字の C E G などをタイプすれば、Ċ Ė Ġ などが入力できる。 だから直観的には、
こうなるはずのところ、 大文字の U+017B の方は確かにそうなのだが、 小文字の U+017C はそうならず、代わりに U+0017 が入力されてしまう。 キーボードレイアウトを作成したとき、 0とCを見誤るなどして017Cを017とミスタイプし、 こうなってしまったのではないか。U+0017は普通使い道のないASCII制御文字だし、 仮に必要だとしても [Ctrl]+[W] として既にサポートされているので、より複雑な方法で、デッドキーとの組み合わせで重複収録する意味がない。
キーボードレイアウトの追加・削除や切り替えは簡単で無害なので、興味がある方は試してみよう。
(注1)デッドキー: アクセント記号の付いた文字などを入力するために、最初のキーでアクセント記号だけ入力し、 続けて第2のキーで文字本体を入力することで、最終的に合成された文字が入力される方法がある。 この場合の、最初のキーをデッドキーという。
参考資料(テキスト UTF-8): Canadian Multilingual Standard配列 KL2はUS標準キーボードの対応するキーを示すもの。
英語や日本語のキーボードは、通常状態とShiftを押したシフト状態があり、 ドイツ語やフランス語のキーボードは、 さらにAltGr(注2)を押した「第3シフト」(組み合わせとしてはBase / Shift / AltGr / Shift-AltGr の4通り)がある。 これらの言語ではいろいろなアクセント記号などがあって入力すべき文字の種類が英語より多いので、 1種類のShiftだけでは間に合わないのだ。 ところが「Canadian Multilingual Standard」は、それらに加えて右Ctrlによる「第4シフト」があり、 例えば、数字の [4] のキーの場合、
(注2)AltGr = alternate graphic 「別のグラフィック」とは、それを押しながらある文字キーを押すと別の文字が出るようなキー。 例えば、ポーランド語配列で [L] は小文字の l 、[Shift]+[L] は大文字の L 、そして [AltGr]+[L] は l に棒の入った ł の文字になる。 一般に、右Altキーが [AltGr] キーとして働く。基本的には [Ctrl]+[Alt] でも代用できる。
複雑な多状態シフトとデッドキーの組み合わせにより、このキーボード配列で入力できる文字は多様で、 グリーンランド語の昔の正書法にあったU+0138 [ ĸ ] とか、 マルタ語のU+0135 [ ĵ ] とか、 あるいは日本語のローマ字表記で使われることがある長音符つきの U+0101 [ ā ] U+0100 [ Ā ] U+0113 [ ē ] U+0112 [ Ē ] なども入力できる。
Windows で英語(カナダ多言語)配列のキーボードレイアウトをロードして試してみよう。 言語バーを右クリック、設定→追加から。 言語バーを表示していない場合、 コントロールパネル→地域と言語→言語→詳細→追加から。 英語→キーボードレイアウト「Canadian Multilingual Standard」の後、 言語バーで切り替え。 (メニュー名の訳語は多少違うかもしれない。)
この配列の Input Locale Identifier 旧称 Keyboard Layout (KL) は普通には 0x00011009 (英語、カナダ、変種1)だが、 フランス語、カナダに設定して0C0Cなどから置換呼び出しすることもできる。 ただしカナダのフランス語の標準配列はこれではない。
このKLで、第4のシフトキー(物理的には右Ctrlキー)は、仮想キーVK_OEM_8に再マップされており、VK_CONTROL、 VK_RCONTROLでは検出できない。 VkKeyScan 関数の説明では、 The Hankaku key is pressed(半角キーが押されています)となっている。 カナダ多言語でRCtrlを使うと、ある種「半角シフト」なのだ(単に言葉の定義の問題だが)。 「カナダのキーボードの半角モード」と言われると、日本語圏ユーザーにはちょっと興味深い話だろう。
このキーボード配列のデッドキーのうち、[右Ctrl]+VK_OEM_PERIOD に問題がある。 このデッドキーは右のCtrlを押しながらピリオドのキー(USキーボードでは ">." のキー)を押すことで入力され、 続けて C/e/E/g/G/I/Z をタイプすると上に U+02D9 の記号がついたグリフを合成する。 (続けてスペースバーを押せば、U+02D9 自身を入力することもできる。)
[RCtrl]+VK_OEM_PERIOD U+02D9 [ ˙ ] DEADKEY for: VK_C [ c ] → U+010B [ ċ ] [Shift]+VK_C [ C ] → U+010A [ Ċ ] VK_E [ e ] → U+0117 [ ė ] [Shift]+VK_E [ E ] → U+0116 [ Ė ] VK_G [ g ] → U+0121 [ ġ ] [Shift]+VK_G [ G ] → U+0120 [ Ġ ] [Shift]+VK_I [ I ] → U+0130 [ İ ] VK_Z [ z ] → U+0017 [ ] // Why not [ ż ]? [Shift]+VK_Z [ Z ] → U+017B [ Ż ]
U+0017 がおかしいのが分かる。なお、Shiftなしのiも組み合わせとして使えない。 i の場合は逆に点を消して点のないU+0131 : ı を出せてもいいかもしれないが、そうはなっていない。 2個点をつけて、U+00EF [ ï ] にすればいいという考えもあるだろうが、 U+00A8 [ ¨ ] シリーズは別のデッドキーでサポートされており、そちらにまとめたほうが分かりやすい。 大文字の [I] がサポートされていて小文字の [i] が使えないことは特に問題ないだろう。 一方、大文字の [Z] がサポートされていて小文字の [z] が使えない(単に使えないだけでなく、 変なコードポイントにマップされる)のは、何らかの設計ミスではないかと思われる。
Canadian Multilingual Standard Keyboard Layout
http://www.microsoft.com/globaldev/keyboards/kbdcan.htm
のソースを見ても、
U+02D9 Dot Above [...]  Ż
となって、0x0017が「仕様」であることが分かる。
Sorting it all Out : Getting all you can out of a keyboard layout, Part #9b
http://blogs.msdn.com/michkap/archive/2006/04/13/575500.aspx
では下記のように、同じデータをダンプしているが、
著者は0x0017の特異性には触れていない。
0x02d9 10 0x0020 0x02d9 0x0063 0x010b 0x0043 0x010a 0x0065 0x0117 0x0045 0x0116 0x0067 0x0121 0x0047 0x0120 0x0049 0x0130 0x007a 0x0017 0x005a 0x017b
[CapsLock] キーは普通、大文字小文字のある文字について [Shift] なしで大文字を出すのに使う。 つまり [CapsLock]+小文字 は [Shift]+小文字 と同じ意味になる。 ところが、キーボードレイアウト「ドイツ語(スイス)」「チェコ語」「チェコ語(QWERTY)」「ヘブライ語」では [CapsLock] がまったく別の文字を出すのに用いられることがある。この SGCaps のしくみについて。
Swiss German KL は Amazing
本物だと [P] と [Enter] の間に2つ、 [L] と [Enter] の間に3つキーがあるが、 USキーボードでは逆に上が3つ、中が2つなので、 本物はこうだけど、
P ü ! ENTER L ö ä $
$のキーが上にあることにしておく。
P ü ! $ L ö ä ENTER
$のキーは以下の話では関係ないので、この点はどうでもいい。 そんなことより実用上差し迫った問題はUSキーボードだと不等号が打てなくなることだが、 それはちょっと置いておいて。
スイスにはフランス語とドイツ語そのほか言語が混在してるようで、 いろいろな都合で(人名とか)日常的に両方タイプしなければならないこともあるのだろう。 スイス・ジャーマンとスイス・フレンチの配列はほとんど同じだが、上記の üöä キーがスイス・フレンチでは èéà になる。そしてそれを [Shift] で入れ替えられる。つまり…
スイスジャーマンでは [Shift]+üöä が èéà になって、 逆にスイスフレンチでは [Shift]+èéà が üöä になる。 メインに使う言語で常用する文字が [Shift] なしで入れられるようになっている。 そして [Shift] で切り替えて他方の文字も出せる。
ここまでは納得できるが、問題は…
[Shift]+üöä が èéà なら大文字のÜÖÄ はどうやってタイプするのよ? さらにÈÉÀの立場はどうなるのよ?
激しく疑問。
[AltGr] は文字 [ ] { } 用に既に使ってしまっている(AltGrについてはカナダ多言語配列参照)。 もう一つシフト状態が必要だ。 [Shift]+[AltGr] ではうまくない。例えば [Shift]+[AltGr] で ÜÖÄ を出せるようにしても ÈÉÀ が困る。 カナダ多言語みたいに [右Ctrl] を使うか? しかし [右Ctrl]+[Shift]+[Pの右隣] など、タイプしにくそう。 カナダ多言語では実際そういうキーもあるが…。
スイスジャーマン、スイスフレンチは、この問題に異なるアプローチをしている。 まずスイスジャーマン独特の方法は、
これは分かりやすい。ただ ÜÖÄ が必要になるたびに [CapsLock] をかけて、 その1文字をタイプしたら [CapsLock] を外すのは、 いかがなものか。この点はスイスフレンチ配置との比較で、 後でまた考える。とりあえずここで理論的におもしろいのは、 [CapsLock] をトグルすると [Shift] が押しっぱなし状態になる…という常識を裏切って、 [Shift] あり、なし、[CapsLock]オン状態での[Shift]あり、なし、の4状態が全部別々になる、ということ。 上記のように1キーでドイツとフランスの大文字小文字を入れる必要上、そうなっている。
[CapsLock] をオンにして、さらに [Shift]+すると別の文字が出る、とは、 忍者の手裏剣のような(?)キーボードだ。
さて、ここからが本当にややこしいところで、スイスフレンチのほうは、このやり方をサポートしておらず、 デッドキーを使うのだ…(デッドキーについてはカナダ多言語配列参照)。USキーボードのキー名で言うと、
È : [Shift]+[+], [Shift]+[E] É : [AltGr]+[-], [Shift]+[E] À : [Shift]+[+], [Shift]+[A] Ü : []], [Shift]+[U] Ö : []], [Shift]+[O] Ä : []], [Shift]+[A]
デッドキーの修飾キーが ` のときは [Shift] で ´ のときは [AltGr] というあたり、ちょっと難しい。 こんな Emacs のようなことをやるくらいなら[CapsLock] をオンにすると1本指の üöä が1本指の ÜÖÄ になる、というほうが、 少なくとも最初はとっつきやすいだろう。しかし具体的に in Österreich とタイプするとして、問題になる n Ös の部分を考えると、 スイスジャーマン式では次のように4文字で6ストローク消費する。
[N], [Space], [CapsLock], [ö], [CapsLock], [S]
スイスフレンチ式では上記と同じ表記を使って、
[N], [Space], []], [Shift]+[O], [S]
と1ストローク節約できる。 やはり ÜÖÄ で始まる単語があるたびに [CapsLock] をトグル、アントグルするのは効率悪い。 [CapsLock] に入るところはまだいいのだが、 1文字タイプしただけでまた小文字に戻すその動作がわずらわしい。 もっとも üöä キーは右手なので、左手小指でできる [CapsLock] のトグルは比較的苦にならない(これが [A] のキーだったら、 [CapsLock] はうっとうしいだろう)。 一方、スイスフレンチ式も、ウムラウトを出すデッドキーが小指の奥の上の遠方にあって、 それ自身は [CapsLock] よりわずらわしい。しかもそのあと [Shift]+[O] の重ね打ちが必要なので、 指がつりそうだ。 実はウムラウトのデッドーキーの位置はフィンランドと同じだが、 フィンランド式だったらÖÄは単に[Shift]+öäなので、まるで比較にならない(つまりこのデッドキーは、実際にはËÜ用でÖÄには必要ない、そしてËÜなどという文字は普段使わない)。 öä自体もフィンランドと同じなのだが、スイスジャーマンではシフトすると éà だ。 本家フレンチ(or カナダ)だったら、ウムラウトのデッドキーがUSで言う { の位置でもう一歩近いのですが…。 どっちにしてもデッドキーはちょっとわずらわしいわけで、 どちらの方式が良いかは微妙。
実際には、スイスジャーマンでも、スイスフレンチと同じデッドキーが使え、 CapsLockでもデッドキーでも、 どちらも好きな方法が使える。スイスフレンチのほうはデッドキー方式しか使えず、 スイスジャーマンのほうが上位互換なのだ(üöä と èéà のシフト関係が逆になる以外は)。 フランス語の方は特殊文字はèéàだけじゃ足りないので、どっちにしろデッドキーでいくしかない。 CapsLock方式は三文字だけ何とかすればいいドイツ語のみの解決法だ。
案外、日本語の106だか109だかボタンが多いキーボードだといけるのかも…ですが、 104キーボードだとキーが少ないので、次のような問題が発生する。 Lのとなりにöとäが割り込むと、必然的に、そこにもともとあった;:が行き場を失い、 下に押し出せれ,と.のシフトが;と:になる。 で、そこにもとあった<と>がどこへともなく消えてしまう。 不等号押し出し殺人事件。 これがホントのデッドキー。 実はもう一人(スイスではü、フィンランドではå)割り込むので、 もう一人、押し出せれるキーがいて、それはスイスではバックスラッシュ、フィンランドでは縦棒 | なのですが、 不等号が出せない段階で既に話にならんので、第3の犠牲者のことはもはやどうでもいい…。HTMLすら打てない。
これで分かるのは、US国際の利点は、US配列の自然な拡張になっていて、 それは単に覚えやすいだけでなく、104キーのままで問題が起きない、ってこと。 豆知識として、上記の状態でどうしても不等号を出す必要があるときは、 [Alt]を押したままテンキーで60と62で出せる……がいちいちそんなことしてられないので、現実的に、 キーボードレイアウトを戻すしかないでしょう。
スイスジャーマン配列のキーボードでは、CapsLockの独特の使い方により、一つのキーと一つの[Shift]だけで4種類の文字がタイプできることを見た。
「忍者の手裏剣のよう」と書いたが、 「小さな場所に折り畳んであっていろいろ出てくるスイスアーミーナイフ」というのがさらにいい例えかも。 スイスだと1個のキーに4つの刃があってトグルでぐるぐる回るのは「十文字手裏剣」みたいなんだけど、 スイス以外では必ずしもそういう感じでないので。
この方式は Swiss German (SG) の CapsLock ということから、SGCaps (または SGCap)と呼ばれている。 (参考文献: Unicode and Keyboards on Windows)
1キーから思いがけないいろいろモノが飛び出す様子をまとめてみた(キーの場所は昨日のメモ参照)。
BA VK_OEM_1 U+00FC [ ü ] BA [Shift]+VK_OEM_1 U+00E8 [ è ] BA [AltGr]+VK_OEM_1 U+005B [ [ ] BA [SGCaps]+VK_OEM_1 U+00DC [ Ü ] BA [SGCaps]+[Shift]+VK_OEM_1 U+00C8 [ È ] DC VK_OEM_5 U+00E4 [ ä ] DC [Shift]+VK_OEM_5 U+00E0 [ à ] DC [AltGr]+VK_OEM_5 U+007B [ { ] DC [SGCaps]+VK_OEM_5 U+00C4 [ Ä ] DC [SGCaps]+[Shift]+VK_OEM_5 U+00C0 [ À ] DE VK_OEM_7 U+00F6 [ ö ] DE [Shift]+VK_OEM_7 U+00E9 [ é ] DE [SGCaps]+VK_OEM_7 U+00D6 [ Ö ] DE [SGCaps]+[Shift]+VK_OEM_7 U+00C9 [ É ]
SGCaps方式は、比較的まれだが、スイスジャーマン(SG)以外のキーボード配列でも使われている。 SG以外のSGCaps使用例はチェコ語とヘブライ語だが、ヘブライ語のキーボードは面倒っぽいので今回はパスして、 チェコのSGCapsを調べてみよう。
本家スイスジャーマンではSGCapsが仕込まれているのは3キーだけだが、チェコのSGCapsはキー数が増えパワー増強している。 一方、本家ではただの [SGCaps]+ と そこからさらにShiftした、[SGCaps]+[Shift]+ があるが、 チェコでは [SGCaps]+[Shift]+ はなく、ギミック感はちょっと低めかも(?)。 1キーから最高4つまでしか飛び出さない(笑)。しかし、デッドキーが同じキーに仕込んであったりして国際色は豊かだ。 対照的にスイスジャーマンなんてジャーマンのくせに ß がどこにもない。 スイスジャーマンでは使わないからいいようなものだが、一応ドイツ語キーボードなら ß くらいサポートしても良さそうなものだ。 SG配列はコンパクトにまとまっている半面「閉鎖的」というか「個人主義的」というか「外部への気配りがない」?と言えよう。 まあ余計なものを「念のため」とごたごた入れないからこそコンパクトなわけで、 SG配列のピシッとした強烈な印象の裏表、というところ。
本家SG配列では、A~Zの文字キーではAltGrを使わないし、 SGCapsが仕込んであるキーにはデッドキーは仕込まない。 いろいろ入っているけど清潔にすっきりまとまっている。 チェコ語キーボードはもっといろいろ出せるぶん、あまりすっきりはしていない(同じキー数でいろいろ出せれば、 すっきりしないのはやむを得ない)。
どんな文字があるか把握しないとキーボードの配列も理解しづらいので調べてみた。
通常のアルファベット26文字に加えて、
(1) 母音字AEIOUとYに鋭アクセントが付くことがある(Á É Í Ó Ú Ý)。付かない母音字の長母音化。
(2) 母音字Uにリングが付くことがある(Ů)。歴史的に本来Óだったのが Ú に発音が変わった場合。
(3) 母音字Eと子音字CDNRSTZにハーチェクが付くことがある(Č Ď Ě Ň Ř Š Ť Ž )。口蓋化のたぐい。
Ě/ě はチェコ語独自の文字で前の子音の口蓋化(ne ネ VS. ně ニェ)。
ロシア語でいうエーとイェー(эとе)であろう。
言語学的にはこのほか Ch があるが単にC+hの2グリフで表記するので、ここでは考えない。
チェコ語だけで考えると、それほど特殊文字が多いわけではない。 フランス語と同じ程度で、理論的には SGCaps を使わなくても間に合うだろう。 スイスジャーマンと同じで「SGCapsなしでも済むが使ったほうが分かりやすいので」という発想と思う。 チェコ語配列はチェコ語以外の文字も手厚くカバーしている。 [AltGr]+[L] でポーランド語の [ Ł ] が出たりする。 デッドキーもいろいろある。 よって重層的に折り畳む必要性は増加し、 チェコ語だけなら「SGCapsなしでも済む」と言えても、 「チェコ語キーボード配列」全体で見ると、SGCapsの必然性は増えている。
チェコ語配列にはいくつかバリエーションがあるが、Windowsのデフォを調べた。
主に [1] 以外の数字キーに SGCaps が仕込まれている。 チェコ語キーボードの数字キーは、それだけだと下記の小文字が出て、 数字を出すには [Shift] を併用する。 言い換えると、ただの [Shift] では小文字に対応する大文字は出てこず、普通の数字キーになる。 小文字に対応する大文字を出すには、[SGCaps] (つまり [CapsLock] をオンにする)というわけ。 [AltGr] では比較的まれな文字へのデッドキーとなる。 本家スイスジャーマンとは少し感じが違うが、それなりにシンプル、かな…。
30 VK_0 U+00E9 [ é ] 30 [SGCaps]+VK_0 U+00C9 [ É ] 32 VK_2 U+011B [ ě ] 32 [SGCaps]+VK_2 U+011A [ Ě ] 33 VK_3 U+0161 [ š ] 33 [SGCaps]+VK_3 U+0160 [ Š ] 34 VK_4 U+010D [ č ] 34 [SGCaps]+VK_4 U+010C [ Č ] 35 VK_5 U+0159 [ ř ] 35 [SGCaps]+VK_5 U+0158 [ Ř ] 36 VK_6 U+017E [ ž ] 36 [SGCaps]+VK_6 U+017D [ Ž ] 37 VK_7 U+00FD [ ý ] 37 [SGCaps]+VK_7 U+00DD [ Ý ] 38 VK_8 U+00E1 [ á ] 38 [SGCaps]+VK_8 U+00C1 [ Á ] 39 VK_9 U+00ED [ í ] 39 [SGCaps]+VK_9 U+00CD [ Í ]
数字キー以外は、以下の2カ所。
BA VK_OEM_1 U+016F [ ů ] BA [Shift]+VK_OEM_1 U+0022 [ " ] BA [AltGr]+VK_OEM_1 U+0024 [ $ ] BA [SGCaps]+VK_OEM_1 U+016E [ Ů ] DB VK_OEM_4 U+00FA [ ú ] DB [Shift]+VK_OEM_4 U+002F [ / ] DB [AltGr]+VK_OEM_4 U+00F7 [ ÷ ] DB [SGCaps]+VK_OEM_4 U+00DA [ Ú ]
アルファベット表と比較すると Ó および Ď Ň Ť に単一ストロークが割り当てられていない。 ´ については [AltGr]+VK_9 または BackSpace の右隣(US配列で“=”)がデッドキー。 ˇ については [AltGr]+VK_2 がデッドキー。[AltGr]+[O] などによる直接割り当てはない。 めったに使われない文字なのだろう。 なお [AltGr]+VK_4 のデッドキーは紛らわしいのだが丸っこい ˘ で尖った ˇ ではない。 ăĂğĞ が出る。ăĂ はルーマニア語用、ğĞはトルコ語など用だろうか。
チェコ語のアルファベットはチェコだけでなく、いろいろなバルトスラブ語のアルファベットの基礎になっているそうだ。 エストニア以外のバルト三国とか、旧ユーゴとかだろう。 バルトスラブ系では国際的システム、というわけで、キーボードもチェコ系ばかりかそれ以外の文字も出せるようになっている。 ポーランド語(チェコ語とは別系統の表記をする)用だろうな、みたいな文字もある。
スイスジャーマンでは
基本状態→[Shift]→[SGCaps]→[SGCaps]+[Shift]
と「折り畳まれた」1キーが4段階に「伸びて」くるのが印象的だった。
トグルのトグルの…とぐるぐる回転する十文字手裏剣。
チェコでは [SGCaps] + [Shift] で新しいことは起きない。
CapsLockがオンでもオフでも[Shift]+数字キーは数字となる。
数字には大文字がないので、当然かも。
数字以外の2カ所も同様だ。実際にタイプしてみると、こんな感じ。
+ěščřžýáíé 1234567890 +ĚŠČŘŽÝÁÍÉ 1234567890
んー、やっぱ「スイスアーミー」に比べてギミック感が足りませんな(笑)