Shift＋0 だけ何も入力できないのってなんで？？

# 茶番
ポコちゃん（5さい）「ねーねーポカ村～、」

ポコちゃん「キーボードでShiftキーを押しながら入力をすると上に書いてある文字が入力できるけど」

ポコちゃん「 **Shift＋ゼロ だけ何も入力できない**のってなんで？？」

ポカ村「えーーっと………」

ポカ村「カタカタ…（おもむろにChatGPTに聞きだす）」

ポカ村「ゼロのキーだけShiftを押しても入力できる文字が存在しないのは、」

#### ChatGPTのおこたえ（注：ぜんぜん違います）
> 日本語配列で「シフト + 0」に対応する記号がない理由を、以下の4つの観点から説明します：
> 
> 1. **キー数の制限**  
>    日本語配列キーボードは、英語配列と異なり、ひらがなやカタカナ入力、変換キーなどを含むため、利用可能なキーの数が限られています。その中で優先順位が高い文字や記号が割り当てられ、「シフト + 0」の割り当ては後回しになったと考えられます。
> 
> 2. **必要性が低い**  
>    「0」のシフト操作に対応する記号は日本語の文書作成ではほとんど必要とされません。他の記号と比べて使用頻度が低いため、この位置に記号を割り当てる重要性が低いと判断された可能性があります。
> 
> 3. **記号配置の工夫**  
>    日本語配列では、英語配列と異なる記号配置が行われています。例えば「)」（括弧閉じ）は「Shift + 9」に割り当てられており、他の記号も効率的に配置されています。この結果、「シフト + 0」を活用しなくても記号入力が十分可能な設計となっています。
> 
> 4. **歴史的背景**  
>    かつては「シフト + 0」に「～」（波ダッシュ）が割り当てられていましたが、JIS規格の改定により「～」は「Shift + ^」に移動しました。この変更後、「シフト + 0」は特に必要性がないとされ、未割り当てのままとなりました。
> 
> 結論として、日本語配列の設計上「シフト + 0」に割り当てられる記号が不要と判断され、結果的に未使用の状態が長らく維持されています。

----

ポカ村「ってことやで（自信満々）」

ポコちゃん「…………」

ポコちゃん「**ポーっと生きてんじゃねーよ！！！！！**」


# シンキングタイム
せっかくなので、理由を考えてみてください。

…

…

…

…

仕方なしに自分の脳みそで考え出したポカ村「入力できる文字の数が奇数だったから…？」

ポコちゃん「**ポーっと(ry**」

…

…

惜しい！！

文字の総数、実は偶数です。

キーボードをよく見ると…

- 右上のキー「￥（円記号）」
- 右下のキー「＼（バックスラッシュ）」

よくよく考えると、この2つ、字体が異なるだけで実際は同じ文字です。

キーボード上に描かれている文字の個数は奇数ですが、うち2つは同じものなので、実際に入力できる文字の個数は偶数です。

…

…


# ほんとうの理由
唐突ですが、日本語配列のキーボードの下段と上段の文字について、**文字コード**を見てみましょう。

参考：[ASCIIコード表 - IT用語辞典 e-Words](https://e-words.jp/p/r-ascii.html)

|   | 文字コード   |   | 文字コード   |
|:-:|:------------|:-:|:------------|
| a | 1**1**00001 | A | 1**0**00001 |
| z | 1**1**11010 | Z | 1**0**11010 |
| 1 | 01**1**0001 | ! | 01**0**0001 |
| 2 | 01**1**0010 | " | 01**0**0010 |
| 3 | 01**1**0011 | # | 01**0**0011 |
| 4 | 01**1**0100 | $ | 01**0**0100 |
| 5 | 01**1**0101 | % | 01**0**0101 |
| 6 | 01**1**0110 | & | 01**0**0110 |
| 7 | 01**1**0111 | ' | 01**0**0111 |
| 8 | 01**1**1000 | ( | 01**0**1000 |
| 9 | 01**1**1001 | ) | 01**0**1001 |
| 0 | 0110000     |   |             |
| - | 01**0**1101 | = | 01**1**1101 |
| ^ | 1**0**11110 | ~ | 1**1**11110 |
|￥ | 1**0**11100 |\| | 1**1**11100 |
| @ | 1**0**00000 | ` | 1**1**00000 |
| [ | 1**0**11011 | { | 1**1**11011 |
| ; | 01**1**1011 | + | 01**0**1011 |
| : | 01**1**1010 | * | 01**0**1010 |
| ] | 1**0**11101 | } | 1**1**11101 |
| , | 01**0**1100 | < | 01**1**1100 |
| . | 01**0**1110 | > | 01**1**1110 |
| / | 01**0**1111 | ? | 01**1**1111 |
|\\ | 1**0**111**00** | _ | 1**0**111**11** |

そう、実は…

Shiftで入力できる上段のキーは、**下段のキーの文字コードのビットを1個だけ反転させた文字コード**だったのです！！！
し、知らなかった……
全部2bit目という訳ではないですが、最初の`1`の右を反転、とかなり規則正しい並びですね。

なるほど…
確かに、Shiftの入力前後でPC本体に送信されるキーコードが特に関係ないペアになっているよりも、特定のビットを1個だけ反転させるという処理の方がキーボードの基盤がシンプルになりそうな感じがします。
（参考：[JISキーボード - Wikipedia](https://ja.wikipedia.org/wiki/JIS%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89#%E6%AD%B4%E5%8F%B2)）

ただし、この条件に当てはまらないキーが2組あります。

|   | 文字コード   |   | 文字コード   |
|:-:|:------------|:-:|:------------|
| 0 | 0110000     |   |             |
|\\ | 1**0**111**00** | _ | 1**0**111**11** |

バックスラッシュくんは円記号のエイリアスなので放っておきましょう。
今注目したいのはゼロのキーについてです。

## 例外1：キー `0`

ゼロの相方の文字はキーボード上に存在しないので、文字コードを経由して考えてみましょう。

ゼロの文字コードは `0110000` です。
ほかのキーは最初の`1`の次のビットを反転させているから、これにも適用させると `0100000` となります。
文字コード `0100000` に対応する文字は…

「`SP`」…
そう……

半角スペース！！！

つまり、ルール通りだった場合、Shift＋ゼロ は**半角スペースが入力される**というのが本来の挙動だったはずだと考えられます。

|   | 文字コード   |    | 文字コード   |
|:-:|:------------|:--:|:------------|
| 0 | 01**1**0000  |`SP`| 01**0**0000  |

Shift＋ゼロ⇒スペース なんて変でしかないので「何も入力されない」という例外を設定したんでしょうね。
スペースを入力する専用のスペースキーがありますし。
（憶測ですが…）

## 例外2：キー `\`（おまけ）

オマケです。

ここで、放置していたイレギュラーのバックスラッシュくんについても考えてみましょう。

|   | 文字コード   |   | 文字コード   |
|:-:|:------------|:-:|:------------|
|￥| 1**0**11100 |\| | 1**1**11100 |
|\\ | 1**0**111**00** | _ | 1**0**111**11** |

`￥`（円記号）と`\`（バックスラッシュ）はキーボード上では違う字体になっていますが、入力されるのは同じ文字です。

なんていうか、**とりあえず空いてたからねじ込まれた**感がすごいですね。
バックスラッシュくんはバーティカルバーという本来の相方が既にいるので、アンダーバーを起点にして考えてみましょう。

アンダーバーの文字コードは`1011111`なので、2bit目を反転させると…
`1111111`！

すごい見るからに特別なビットの並び！
この文字コードに対応する文字は「`DEL`」です。

全ビットが`0`である「`NUL`」と対になるこの文字は、伝説の記録デバイス「パンチカード」に由来する文字です。

まだモニターも無かったイニシエの時代、古代人は紙製のカードにデータを記録していたんだそうな。
モニターどころかキーボードも無いので、パンチカードは出力だけでなく入力にも使われてました。

このパンチカード、入力を間違えて変なパターンで穴を空けてしまった場合、穴なので埋めることができません。
そこで、**全ビット穴が空いている＝読み飛ばす**というように処理していたそうです。
間違えた文字をぐりぐりと真っ黒い丸で塗りつぶすようなイメージ。
古代人、頭いいですね…

というわけで、この「`DEL`」文字は歴史的な理由で残っている制御文字です。
現在は文字としては使われていません。
（ASCIIコード、実はこんな感じの太古の文字が20個くらいある）

キーボードで入力する必要が無い文字なのでアンダーバーが相方ナシになった訳ですが、キーに空きを作るよりかは…ってことで、とりあえず適当なキーで埋めたんでしょうね。

## 当然発生するツッコミ

話を聞いていたポカ村「ゼロとアンダーバーを一緒のキーにすればええやん」

………！！

たしかに…！！？

相方がいないゼロキーの Shift＋ゼロ に同じく相方のいないアンダーバーを割り当てれば、バックスラッシュを円記号と一緒にしてキーを1個節約できたはず。

なんでこんな無意味に冗長な配置を…？

……

……

これは今書きながら考えた理由ですが…

**かな入力に対応するために48個のキーが必要**

ということではないでしょうか。

かな入力なんて人生で0回くらいしか使ったことがないのでよく知りませんが、改めてキーの右下のかな入力用の文字を見てみると

- あ～わ、ん：45文字（を だけShift入力）
- 濁音と半濁音：2文字
- 長音（ー）：1文字

と、48個のキーがあります。
言われてみれば、どれも日本語の入力に必須な文字です。

ASCIIの 英数字＋記号 は94文字＝キー47個なので、かな入力よりも1個要求が少ないですね。

「Shift＋濁音 で半濁音にすれば良くない？」とか今思ったんですけど、なにか凡人には思考の及ばない深～い理由があるんでしょう。
ぱ行だけ入力を面倒くさくしてハブるのもなんか可哀想ですし。

それに、憶測ですが…

|   | 文字コード   |   | 文字コード   |
|:-:|:------------|:-:|:------------|
| 0 | **01**1**0000** | _ | **10**1**1111** |
|\\ | 1**0**111**00** | _ | 1**0**111**11** |

**ゼロとアンダーバーはビットの差異が多すぎる**というような理由もあるんじゃないでしょうか…？
ビットの差が多いとキーボードの基盤が複雑になるんでしょうか？
よく知りませんが…。

ほとんど全ビット反転となるような組み合わせにするよりも、多少ビット的な距離が近く、字体が2種類あるバックスラッシュくんをアンダーバーの相方にすることで何か良いことがあったんでしょう。たぶん。
むしろNOTをかけるだけで済んで基盤回路が簡略化できそうですし、違うかもですが。

…締まらない…。


# まとめ
本来は Shift＋ゼロ＝スペース のはずだが、スペースバーがあるのでハブられた。と思われる（独自研究）

ポカ村「生成AIのハルシネーション生成能力には目を見張るものがあるやで」

ポョエちゃん「ポカーーッ」


# おまけ情報
Shiftなし＆Shiftあり の文字コードのビットの距離（[ハミング距離](https://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%9F%E3%83%B3%E3%82%B0%E8%B7%9D%E9%9B%A2)）を1で統一しているのは日本語用のJISキーボード限定です。（参考：[Bit-paired keyboard - Wikipedia](https://en.wikipedia.org/wiki/Bit-paired_keyboard)）
英語配列のキーボードでは、ビットの近さなんてぜんぜん考慮していなさそうな文字が相方になっています。


# 参考ページ
https://ja.wikipedia.org/wiki/JIS%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89

https://ja.wikipedia.org/wiki/%E5%89%8A%E9%99%A4%E6%96%87%E5%AD%97