文字 → ASCII コード
メモリには、文字そのものは入らない
メモリに入るのは 0 と 1 の並びだけです。A という形をそのまま置くことはできません。それでも画面に A が出るのは、「この番号は A ということにする」という取り決めがあるからです。
その取り決めのうち、いちばん古くて基本になるのが ASCII です。英数字と記号あわせて 128 種類に、0 から 127 までの番号を割り当てています。A が 65、a が 97、文字としての 0 が 48。プログラムから見れば、文字は小さな整数で、文字列はその整数の並びでしかありません。
番号が連続しているから、比較に意味が出る
番号は適当に振られたわけではなく、A から Z、a から z、0 から 9 がそれぞれ連続するように並んでいます。だから文字の大小比較が、そのまま辞書順として使えます。
Python
print('a' < 'b') # True
print('Z' < 'a') # True 大文字のほうが番号が小さい
print(sorted(['banana', 'Apple', 'cherry']))
# ['Apple', 'banana', 'cherry']Apple が先に来たのは、A が 65 で b が 98 だからです。人間の感覚では大文字も小文字も同じ文字ですが、番号の世界では 32 も離れています。名前の一覧を並べたとき、大文字始まりだけ上に固まるのはこれが理由です。
連続しているおかげで、引き算にも意味が出ます。文字の 5 から文字の 0 を引くと 5。文字コードの世界では、数字を数に直す手当てがこれで済みます。
32 の差は、1 ビットの差
a の 97 から A の 65 を引くと 32 です。32 は右から 6 桁目の重みそのものでした。2 進数で並べてみます。
プレーンテキスト
A -> 100 0001
a -> 110 0001違うのは 1 桁だけです。大文字と小文字の切り替えが、その 1 ビットを立てるか落とすかで済むのは、番号の振り方がそう作られているからです。第 1 章のマスクが、そのまま文字の世界でも効きます。
番号を取り出す道具は、言語ごとに名前が違う
どの言語にも、文字を受け取ってその番号を返す道具が用意されています。名前は言語ごとに違い、渡し方も、文字列の何番目を見るかを指定するものと、1 文字だけを受け取るものに分かれます。使う言語のものを 1 つ調べてください。
共通しているのは、見るのが 1 文字だけだという点です。2 文字以上を渡すと、エラーで止まる言語と、先頭だけ見て黙って通る言語があります。厄介なのは後者で、AB を渡して 65 が返っても、それは B が無視されただけです。
要件
- 1 文字を受け取り整数で返す
- ASCII 範囲の文字に対応する
- 戻り値の型は int
入出力例
charToCode("A") → 65
charToCode("Z") → 90
charToCode("a") → 97
charToCode("z") → 122
charToCode("0") → 48
charToCode("9") → 57
charToCode(" ") → 32