コード → 文字
番号は出せても、画面には出せない
前回、文字から番号を取り出せるようになりました。ところが計算した結果を人に見せる段になると、手が止まります。68 という数を出したところで、読む人には D だとは分かりません。行きがあるなら、帰りも要ります。
番号から文字へ戻す道具も、どの言語にも用意されています。行きの道具と対になっているので、片方を覚えればもう片方も思い出せます。
往復させると、必ず元へ戻る
文字を番号にして、その番号を文字に戻すと、元の文字になります。逆に番号から文字を作って、その文字の番号を取り直しても、元の番号です。この往復が保証されているおかげで、途中の処理を安心して整数のまま進められます。
番号が連続していることも、そのまま使えます。A の番号に 0 から 25 を順に足していけば、アルファベット 26 文字がひと通り作れます。対応表をコードに書き写さなくても、開始位置と個数だけで並びを組み立てられる、というのが文字を番号で持つことの利点です。Excel の列名や連番の採番も、この形で作られています。
戻す道具は ASCII 専用ではありません。0x3042 を渡せば あ が出てきます。番号の対応表が ASCII の外まで続いているだけで、やっていることは何も変わりません。
26 で折り返す
番号にして計算する典型が、文字をずらす暗号です。A を 3 つ進めて D にするだけなら、番号に 3 を足せば済みます。困るのは端です。Z に 3 を足すと番号は 93 になり、これは ] という記号になってしまいます。
アルファベットは 26 文字で輪になっているので、A からの距離を 26 で割った余りに直してから、A の番号に足し直します。
Python
base = 65 # A の番号
i = 23 # X は A から数えて 23 番目
print((i + 3) % 26) # 0 A に戻ってきた
print(base + (i + 3) % 26) # 65同じ形は、12 時間表記や曜日の計算でも出てきます。輪になっているものは余りで扱う、と覚えておくと使い回せます。
範囲の外を渡すと、静かに壊れる
戻す道具は、渡された番号が正しいかどうかを検算してくれません。負の数や大きすぎる数を渡したとき、エラーで止まる言語もあれば、下位のビットだけを見て別の文字を返す言語もあります。
危ないのは後者です。例外が出ないので、化けた文字がそのまま保存され、あとから元の値をたどれなくなります。計算でずらしたあとの番号は、道具に渡す前に想定の範囲へ収まっているかを確かめてください。
要件
- 整数を受け取り 1 文字の文字列を返す
- ASCII 範囲 (0..127) を扱う
- 戻り値の長さは 1
入出力例
codeToChar(65) → "A"
codeToChar(90) → "Z"
codeToChar(97) → "a"
codeToChar(122) → "z"
codeToChar(48) → "0"
codeToChar(57) → "9"
codeToChar(32) → " "