🚑

ANSI配列とJIS配列のミスマッチを生き延びるためのキー割り当て

2024/12/14に公開

まとめ:課題と対策

ANSIキーボードをJIS配列として認識させてしまった場合、入力できない文字があります。

それにより起きる問題の一つとして、ログインしないとキーボード配列の設定を変更できない場合に、ログインするためのユーザー名とパスワードに入力できない文字が含まれていて、にっちもさっちもいかない状況になってしまうことがあり得ます。

QMK対応キーボードであれば、ANSI配列の英数、記号に加えてKC_INT1とKC_INT3をどこかに割り当てておくことでこの状況を回避できます。設定ミスなどいざというときのために、いずれかのレイヤの空いている所に割り当てておくと、配列のミスマッチが生じた際にも生き延びることができるでしょう。

詳細確認

QMKキーコードのうちどれを割り当てればJIS配列のそれぞれのキーの文字入力を再現できるかを整理しましょう。

英数文字のキーはANSIキーボードもJISキーボードも同じ(数字キーの一部でShift押し時の文字が違うのみ)なので、記号の部分について見て行きます。

表の構成は次の通りです:

JIS配列の設定で入力される文字
keymap_extras/keymap_japanese.h で定義されたエイリアス
keycodes.h で定義されたQMKキーコードの短い名前
ANSI配列の設定で入力される文字

「入力される文字」のところは左側がキーを単独で押したとき、右側がShiftと共に押したときに入力される文字です。

JISキーボードの1行目の再現

- = ^ ~ ¥ |
JP_MINS JP_CIRC JP_YEN
KC_MINS KC_EQL KC_INT3
- _ = + (N/A)

JP_YENに対応するキーはANSI配列では存在しないので、その入力のためにKC_INT3をどこかに割り当てておく必要があります。

JISキーボードの2行目の再現

@ ` [ {
JP_AT JP_LBRC
KC_LBRC KC_RBRC
[ { ] }

いずれも、ANSI配列で存在するキーで入力できます。

JISキーボードの3行目の再現

; + : * ] }
JP_SCLN JP_COLN JP_RBRC
KC_SCLN KC_QUOT KC_NUHS
; : ' " \ |

JP_RBRCに対応するキー(KC_NUHS)はANSI配列では存在しないのですが、現象論的にはWindows, macOSでは、ANSI配列に含まれるKC_BSLSでお目当ての文字を入力できました。
なので、以下のような対応関係で考えれば特別な割り当ては必要ありません。

; + : * ] }
JP_SCLN JP_COLN (N/A)
KC_SCLN KC_QUOT KC_BSLS
; : ' " \ |

JISキーボードの4行目の再現

, < . > / ? \ _
JP_COMM JP_DOT JP_SLSH JP_BSLS
KC_COMM KC_DOT KC_SLSH KC_INT1
, < . > / ? (N/A)

JP_BSLSに対応するキーはANSI配列では存在しないので、その入力のためにKC_INT1をどこかに割り当てておく必要があります。

結論

ANSI配列の英数、記号に加え、KC_INT1とKC_INT3を割り当てておけば、ANSI配列とJIS配列のミスマッチを生き延びることができるとわかりました。

なおここまで「生き延びることができる」の厳密な定義を書いていませんでしたが、任意のASCII printable characterを入力できることを要件としていました。

ASCII printable charactersとキーの対応(ANSI+ → JIS)

ASCII printable characterのいずれも入力可能であることを改めて確認しておきましょう。

  • code列, character列: ASCII printable characterのASCIIコードと文字
  • JIS列: JISキーボードをJIS配列として使った場合に使用するキー
  • ANSI+列: ANSI配列にKC_INT1とKC_INT3を加えたキーボードがJIS配列として認識された場合に使用するキー
  • キーの表現でS(*)はShiftを押しながらキーを押すことを表しています
code character JIS ANSI+
0x20 ' ' KC_SPC KC_SPC
0x21 ! S(JP_1) S(KC_1)
0x22 " S(JP_2) S(KC_2)
0x23 # S(JP_3) S(KC_3)
0x24 $ S(JP_4) S(KC_4)
0x25 % S(JP_5) S(KC_5)
0x26 & S(JP_6) S(KC_6)
0x27 ' S(JP_7) S(KC_7)
0x28 ( S(JP_8) S(KC_8)
0x29 ) S(JP_9) S(KC_9)
0x2a * S(JP_COLN) S(KC_QUOT)
0x2b + S(JP_SCLN) S(KC_SCLN)
0x2c , JP_COMM KC_COMM
0x2d - JP_MINS KC_MINS
0x2e . JP_DOT KC_DOT
0x2f / JP_SLSH KC_SLSH
0x30 0 JP_0 KC_0
0x31 1 JP_1 KC_1
0x32 2 JP_2 KC_2
0x33 3 JP_3 KC_3
0x34 4 JP_4 KC_4
0x35 5 JP_5 KC_5
0x36 6 JP_6 KC_6
0x37 7 JP_7 KC_7
0x38 8 JP_8 KC_8
0x39 9 JP_9 KC_9
0x3a : JP_COLN KC_QUOT
0x3b ; JP_SCLN KC_SCLN
0x3c < S(JP_COMM) S(KC_COMM)
0x3d = S(JP_MINS) S(KC_MINS)
0x3e > S(JP_DOT) S(KC_DOT)
0x3f ? S(JP_SLSH) S(KC_SLSH)
0x40 @ JP_AT KC_LBRC
0x41 A S(JP_A) S(KC_A)
0x42 B S(JP_B) S(KC_B)
0x43 C S(JP_C) S(KC_C)
0x44 D S(JP_D) S(KC_D)
0x45 E S(JP_E) S(KC_E)
0x46 F S(JP_F) S(KC_F)
0x47 G S(JP_G) S(KC_G)
0x48 H S(JP_H) S(KC_H)
0x49 I S(JP_I) S(KC_I)
0x4a J S(JP_J) S(KC_J)
0x4b K S(JP_K) S(KC_K)
0x4c L S(JP_L) S(KC_L)
0x4d M S(JP_M) S(KC_M)
0x4e N S(JP_N) S(KC_N)
0x4f O S(JP_O) S(KC_O)
0x50 P S(JP_P) S(KC_P)
0x51 Q S(JP_Q) S(KC_Q)
0x52 R S(JP_R) S(KC_R)
0x53 S S(JP_S) S(KC_S)
0x54 T S(JP_T) S(KC_T)
0x55 U S(JP_U) S(KC_U)
0x56 V S(JP_V) S(KC_V)
0x57 W S(JP_W) S(KC_W)
0x58 X S(JP_X) S(KC_X)
0x59 Y S(JP_Y) S(KC_Y)
0x5a Z S(JP_Z) S(KC_Z)
0x5b [ JP_LBRC KC_RBRC
0x5c \ JP_BSLS KC_INT1
0x5d ] JP_RBRC KC_BSLS
0x5e ^ JP_CIRC KC_EQL
0x5f _ S(JP_BSLS) S(KC_INT1)
0x60 ` S(JP_AT) S(KC_LBRC)
0x61 a JP_A KC_A
0x62 b JP_B KC_B
0x63 c JP_C KC_C
0x64 d JP_D KC_D
0x65 e JP_E KC_E
0x66 f JP_F KC_F
0x67 g JP_G KC_G
0x68 h JP_H KC_H
0x69 i JP_I KC_I
0x6a j JP_J KC_J
0x6b k JP_K KC_K
0x6c l JP_L KC_L
0x6d m JP_M KC_M
0x6e n JP_N KC_N
0x6f o JP_O KC_O
0x70 p JP_P KC_P
0x71 q JP_Q KC_Q
0x72 r JP_R KC_R
0x73 s JP_S KC_S
0x74 t JP_T KC_T
0x75 u JP_U KC_U
0x76 v JP_V KC_V
0x77 w JP_W KC_W
0x78 x JP_X KC_X
0x79 y JP_Y KC_Y
0x7a z JP_Z KC_Z
0x7b { S(JP_LBRC) S(KC_RBRC)
0x7c | S(JP_YEN) S(KC_INT3)
0x7d } S(JP_RBRC) S(KC_BSLS)
0x7e ~ S(JP_CIRC) S(KC_EQL)

参考:ASCII printable charactersとキーの対応(JIS → ANSI)

参考までに、JISキーボードがANSI配列として認識された場合のASCII printable characterの入力網羅性もまとめておきます。

  • code列, character列: ASCII printable characterのASCIIコードと文字
  • ANSI列: ANSIキーボードをANSI配列として使った場合に使用するキー
  • JIS列: JISキーボードがANSI配列として認識された場合に使用するキー
  • キーの表現でS(*)はShiftを押しながらキーを押すことを表しています
code character ANSI JIS
0x20 ' ' KC_SPC KC_SPC
0x21 ! S(KC_1) S(JP_1)
0x22 " S(KC_QUOT) S(JP_COLN)
0x23 # S(KC_3) S(JP_3)
0x24 $ S(KC_4) S(JP_4)
0x25 % S(KC_5) S(JP_5)
0x26 & S(KC_7) S(JP_7)
0x27 ' KC_QUOT JP_COLN
0x28 ( S(KC_9) S(JP_9)
0x29 ) S(KC_0) S(JP_0)
0x2a * S(KC_8) S(JP_8)
0x2b + S(KC_EQL) S(JP_CIRC)
0x2c , KC_COMM JP_COMM
0x2d - KC_MINS JP_MINS
0x2e . KC_DOT JP_DOT
0x2f / KC_SLSH JP_SLSH
0x30 0 KC_0 JP_0
0x31 1 KC_1 JP_1
0x32 2 KC_2 JP_2
0x33 3 KC_3 JP_3
0x34 4 KC_4 JP_4
0x35 5 KC_5 JP_5
0x36 6 KC_6 JP_6
0x37 7 KC_7 JP_7
0x38 8 KC_8 JP_8
0x39 9 KC_9 JP_9
0x3a : KC_QUOT JP_COLN
0x3b ; KC_SCLN JP_SCLN
0x3c < S(KC_COMM) S(JP_COMM)
0x3d = S(KC_MINS) S(JP_MINS)
0x3e > S(KC_DOT) S(JP_DOT)
0x3f ? S(KC_SLSH) S(JP_SLSH)
0x40 @ S(KC_2) S(JP_2)
0x41 A S(KC_A) S(JP_A)
0x42 B S(KC_B) S(JP_B)
0x43 C S(KC_C) S(JP_C)
0x44 D S(KC_D) S(JP_D)
0x45 E S(KC_E) S(JP_E)
0x46 F S(KC_F) S(JP_F)
0x47 G S(KC_G) S(JP_G)
0x48 H S(KC_H) S(JP_H)
0x49 I S(KC_I) S(JP_I)
0x4a J S(KC_J) S(JP_J)
0x4b K S(KC_K) S(JP_K)
0x4c L S(KC_L) S(JP_L)
0x4d M S(KC_M) S(JP_M)
0x4e N S(KC_N) S(JP_N)
0x4f O S(KC_O) S(JP_O)
0x50 P S(KC_P) S(JP_P)
0x51 Q S(KC_Q) S(JP_Q)
0x52 R S(KC_R) S(JP_R)
0x53 S S(KC_S) S(JP_S)
0x54 T S(KC_T) S(JP_T)
0x55 U S(KC_U) S(JP_U)
0x56 V S(KC_V) S(JP_V)
0x57 W S(KC_W) S(JP_W)
0x58 X S(KC_X) S(JP_X)
0x59 Y S(KC_Y) S(JP_Y)
0x5a Z S(KC_Z) S(JP_Z)
0x5b [ KC_LBRC JP_AT
0x5c \ KC_BSLS JP_RBRC
0x5d ] KC_RBRC JP_LBRC
0x5e ^ S(KC_6) S(JP_6)
0x5f _ S(KC_MINS) S(JP_MINS)
0x60 ` KC_GRV JP_ZKHK
0x61 a KC_A JP_A
0x62 b KC_B JP_B
0x63 c KC_C JP_C
0x64 d KC_D JP_D
0x65 e KC_E JP_E
0x66 f KC_F JP_F
0x67 g KC_G JP_G
0x68 h KC_H JP_H
0x69 i KC_I JP_I
0x6a j KC_J JP_J
0x6b k KC_K JP_K
0x6c l KC_L JP_L
0x6d m KC_M JP_M
0x6e n KC_N JP_N
0x6f o KC_O JP_O
0x70 p KC_P JP_P
0x71 q KC_Q JP_Q
0x72 r KC_R JP_R
0x73 s KC_S JP_S
0x74 t KC_T JP_T
0x75 u KC_U JP_U
0x76 v KC_V JP_V
0x77 w KC_W JP_W
0x78 x KC_X JP_X
0x79 y KC_Y JP_Y
0x7a z KC_Z JP_Z
0x7b { S(KC_LBRC) S(JP_AT)
0x7c | S(KC_BSLS) S(JP_RBRC)
0x7d } S(KC_RBRC) S(JP_LBRC)
0x7e ~ S(KC_GRV) S(JP_ZKHK)

全角半角キー(JP_ZKHK)を使う必要があるのでJIS配列として認識された場合の文字割り当てがされているキーの範囲を少しはみ出しますが、たしかにASCII printable charactersを網羅できています。
つまり、JISキーボードがANSI配列として認識された場合に関しては特別なことをしなくても生き延びる余地があります。

Discussion