LoginSignup
4
3

More than 1 year has passed since last update.

HID キーボードから Unicode で日本語を入力する

Last updated at Posted at 2021-05-13

@ukkz さんが作った「USB木魚」。

HIDデバイスにして、あらかじめ学習させたうえで漢字の入力をかな漢字変換キーで行うらしい。

ユーザー辞書を用意するのがめんどくさくなりそうで、刺すだけで般若心経が入力するようにできないでしょうか? HIDデバイスから、日本語を入力する方法を考えてみました。

キーコード

HID持つキーボードは、文字を送る時に ASCII コードなどではなく、キーボード上のキーに対応したコードで送られています。

Arduino で HID キーボードを作る場合は以下のようなライブラリ(libraries/Keyboard/src/Keyboard.cpp)をつかっていて、
image.png

"a" は 0x04,"b"は 0x05、 "V" は 0X19+ SHIFT キーとして定義されていることがわかります。

これは正確には、
「HID Usage Tables FOR Universal Serial Bus (USB) Version 1.22」
https://www.usb.org/document-library/hid-usage-tables-122

の「10 Keyboard/Keypad Page (0x07)」

で定義されています。

image.png

太古の昔、IBM PC の キーボードインターフェースにおいてもASCIIコードとは違う専用のコードを送受信していましたが、そこで使われていたコードはこの表の AT-101 として書かれていて、HID デバイスで使っているものとは別のコードとして定義されているのがわかります。

cf.,「スキャンコード - Wikipedia」
https://ja.wikipedia.org/wiki/%E3%82%B9%E3%82%AD%E3%83%A3%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%89

Unicode を送るには?

HID デバイスのキーコードは基本的にキーボードのボタンに対応するものなので、Unicode のキャラクタを直接送るようなことはできません。一方、キーボードのボタンなので、文字に対応していないキー、すなわちCtrl や Alt,Windows キー などの 押した/離した の情報が送信できます。

込み入った操作をするには、例えば Windows で Exlorer を開くなら、 "Windows キー" + "E" として、"0x7F" + "0x08" を送るなどすることで、人間が操作するように PC の機能を呼び出すことができます。

なので Unicode を送って日本語を入力するには、そのようなキー操作と共に Unicode を送ればいいことになります。

Windows の場合

MS-IME の場合は 文字コード(ex,611b・・・「愛」の Unocode)+F5でコード入力できるっぽいですね。

(2021/05/18追記:@IkadzuchiPleistより以下コメントをいただきました。)

Windowsでは、UnicodeでなくShift_JISでよければデフォルト状態でIMEに依存せず入力できますね。
Altを押しながら、テンキーで10進数の文字コードを入力です。
また、レジストリで「EnableHexNumpad」を設定すれば16進数のUnicodeも使えるようになります。
Altを押しながら、「+」に続いて16進数のUnicode番号を入力です。

Linuxの場合

Ubuntu Linux 20.04 LTS では、IME として Mosc が標準ですが Mosc には Unicode コード入力は無いみたい。あれれー? と思って調べてみたら、 IME OFFの状態でできました。

  • CTRL+SHIFT押下
  • "u"
  • CTRL+SHIFT 開放
  • 文字コード(ex,611b)
  • スペース

OSX の場合

Mac を持っていないのでスミマセン! しかしながらかるく調べた限りでは標準設定のままでは無さそう?

部分的にマルチプラットフォームで Unicode を送るキー操作

上記のことをまとめて、 OSX を除き、Windows と Linux で共通で使えるキー操作を考えてみました。( Mac OSX に対応できていないのが悔しいところ。 )

  • CTRL+SHIFT押下
  • "u"
  • CTRL+SHIFT開放
  • 文字コード(ex,611b)
  • F5
  • CTRL+ALT+スペース
  • "a"
  • BackSpace

解説

  • あらかじめ、WindowsはMS-IMEをON,Ubuntu Linux では IMEをOFFいただきますにしておく。

  • CTRL+SHIFT押下 → "u" → CTRL+SHIFT開放

Ubuntu Linux での文字コード入力PREFIX。 Windowsでは無視される
- 文字コード(ex,611b)

16進数で入力

  • F5

Windowsでの文字コードからの変換動作。Ubuntu Linuxでは無視される

  • CTRL+ALT+スペース

Linuxでの文字コードからの変換、確定動作。Windows で無視するために CTRL+ALT をつけている。

  • "a" → BackSpace

Windowsでの確定動作。エンターだとLinux側に入ってしまうため、適当な文字を入力して削除することで代わりにしている。

4
3
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3