みずぴー日記

人間の再起動ボタンはハワイのビーチにある

📘 #技術書典 の本に書かなかった話

何度か書いているが技術書典 4のい15で入力メソッドについて解説した本を頒布する。

f:id:mzp:20180421131444j:plain

この本では、話題が脇道にそれるのを避けるために、いくつかの話題を排除した。せっかくなのでここに記録しておく。 ただ、いくつか根拠があやふやのものもあるので注意してほしい。

アイヌ語の入力メソッド

アイヌ語はもともと文字を持っていなかったが、カナ表記を用いた表記方法が存在する。 そのためにコㇿポックㇽのㇿやㇽといった小書きカナが存在する。他にもラテン文字による転写もあるが、ここでは扱わない。

この小書きカナを入力するための入力メソッドがアイヌ語入力メソッドである。

カタカナを入力するという点では日本語入力と共通しているが、実装は共通化されておらず、漢字入力の機能もない。扱う言語もjaではなくainとして登録されており、別ものである。

f:id:mzp:20180421132820p:plain

入力メソッドと教育

入力メソッドと教育

日本語入力にローマ字入力とかな入力があるように、中国入力にも拼音入力と注音入力といった複数の入力方法がある。

日本語入力ではローマ字入力の利用が主流だが、中国では地域によって違う。 台湾では注音入力、中国本土では拼音入力が主に用いられている。これは教育の違いに由来するものらしい。

文字を書くというのは教育と深い関係があることが再認識できて興味深い。

入力メソッドと信仰

国際SILは非営利のキリスト教信仰に基づく少数言語のための組織である。(とWikipediaに書いてあった)

国際SILはKeymanという入力メソッドをリリースしている。 これは次のような特徴を持つ。

おそらくありとあらゆる環境で、すべての人が母語を入力できるようにするのが目標なのだろう。

国際SILの目的のひとつは「少数言語の発展を援助する」なので、このために開発を続けているのだろう。自らの信じることのためにひたすら入力メソッドを開発する行為、これはまさしく信仰である。

漢字とは何か

漢字は古代中国で誕生したのち、日本、韓国、ベトナムといった国々に伝来した。

その後、その国の事情にあわせていくつかの文字が追加・転用された。例えば、峠・畑・辻といった日本にのみ存在する国字と呼ばれる文字も存在している。

同様に、現代中国、韓国、ベトナムには他の国にない漢字を元にした文字が存在している。

  • 簡体字(Han)。本当に国字と呼ばれているかは調べきれていない。 現代の中国語表記に用いられるやつ。
  • 和製漢字(Kanji)。日本で作られた漢字。畑とかが有名だと思う。書籍によって日本漢字、国字などと呼ばれていて、どれが正式がよくわからない。
  • ハンチャ(Hang)。韓国で使われる漢字(朝鮮における漢字)。書籍によって朝鮮だったり韓国だったりする。
  • チュノム(Chunom)・ハンノム(HanNom)ベトナムで用いられる文字。 元々の漢字とあわせて使う場合はハンノムになる。

このような状況のため「漢字」と言った際に、どの範囲を指すか不明瞭である。

すべての総称として「漢字」を使う場合もあれば、ベトナム語のように中国由来の文字のチュハン、漢字を応用して作った文字をチュノムというように区別する場合もある。

「漢字と、漢字から派生した文字」という表現もできなくはないが、そうなるとひらがな・カタカナも含まれてしまう。 これは一般には適切ではない。

Unicodeではこのような「漢字」はCJK unified ideographsとなっており「中国、日本、韓国で用いられる表意文字」とされており、厳密な定義を避けてるように見えて興味深い。

中国語の入力メソッド

中国語の入力方法は多数存在する。 macOSに標準搭載されているものだけでも5種類存在する。

f:id:mzp:20180421132519p:plain

これに加えて、中国語の文字体系も1つではなく、簡体字繁体字がある。

これら多数の入力方式を実現するために、中国語入力は以下のような仕組みになっている。

  • 拼音入力、注音入力といった入力方式の違いは、入力モードとして実装する
  • 簡体字繁体字は別の入力メソッドとして実装する
  • 簡体字繁体字の共通部分は内部的なフレームワーク(動的リンクライブラリ)として抽出する

f:id:mzp:20180421132719p:plain

これは他の入力メソッドには見られない仕組みなのでおもしろい。

設定画面のキーボードレイアウト表示

入力ソースの設定画面にはキーボードレイアウトが表示する領域がある。奇妙なことに日本語入力はローマ字入力がかな入力かによって表示がかわる。

f:id:mzp:20180421133404p:plain

入力メソッドとキーボードレイアウトの対応は、システム環境設定の設定ペイン*1にハードコードされている。

000000000000a81b        pushq   %rbp
000000000000a81c        movq    %rsp, %rbp
000000000000a81f        subq    $0x130, %rsp
000000000000a826        movq    0xa823(%rip), %rax ## literal pool symbol address: ___stack_chk_guard
000000000000a82d        movq    (%rax), %rax
000000000000a830        movq    %rax, -0x8(%rbp)
000000000000a834        leaq    0xc125(%rip), %rax ## Objc cfstring ref: @"com.apple.inputmethod.SCIM.WBX"
000000000000a83b        movq    %rax, %xmm0
000000000000a840        leaq    0xbf59(%rip), %rax ## Objc cfstring ref: @"com.apple.inputmethod.SCIM.WBH"
000000000000a847        movq    %rax, %xmm1
000000000000a84c        punpcklqdq      %xmm0, %xmm1
000000000000a850        leaq    -0x130(%rbp), %rcx
000000000000a857        movdqa  %xmm1, (%rcx)
000000000000a85b        leaq    0xc11e(%rip), %rax ## Objc cfstring ref: @"com.apple.keylayout.WubixingKeyboard"
000000000000a862        movq    %rax, %xmm1
000000000000a867        leaq    0xc0d2(%rip), %rax ## Objc cfstring ref: @"com.apple.keylayout.WubihuaKeyboard"
000000000000a86e        movq    %rax, %xmm0
000000000000a873        movdqa  %xmm0, %xmm2
000000000000a877        punpcklqdq      %xmm1, %xmm2
000000000000a87b        leaq    -0xa0(%rbp), %rdx
000000000000a882        movdqa  %xmm2, (%rdx)

そのためこの機能は、外部の入力メソッドからは利用できない。この話はInputMethodKitの非公開機能にも書いし、Radar済みである。

入力モードの使い方

「入力モード」の使い方は言語によって違う。

ベトナム語入力ではTelex,VNIといった入力方式を切り替える。 これは日本語入力で言うところのローマ字入力、かな入力といった違いに相当する。

f:id:mzp:20180424064042p:plain

一方、日本語では「ひらがな」「カタカナ」といった文字の種類の違いを選択する。

f:id:mzp:20180424064150p:plain

なぜこの違いが生じたのかは分からない。 たぶん歴史的なものだろう。

絵文字の可能性

f:id:mzp:20180424063827p:plain

中国語入力・日本語入力が特殊な位置付けになっているのは、漢字の種類が膨大であることが原因の1つである。 Unicodeに収録された文字体系を見ても1万種類を越える文字を持つ言語は稀である。

ただし絵文字は漢字に匹敵する文字数を持つ可能性がある。 現時点で1000文字を越えており、今後も増える可能性がある。さらにSkin toneといった修飾子によって、バリエーションも増やせる。

そのため、絵文字の文字数が増えるにしたがい、入力メソッドのような仕組みが一般化していく可能性がある。

絵文字がある種のUnicodeバグを世界から一掃しつつある件について|Rui Ueyama|note に類似した話だと思う。

*1:/System/Library/PreferencePanes/Keyboard.prefPane/Contents/Resources/IntlKeyboard.prefPane