ANSI配列とJIS配列のミスマッチを生き延びるためのキー割り当て
まとめ:課題と対策
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