コンピューターサイエンス入門:理論編
文字 → ASCII コード
この回でやること
ASCIIの文字と番号の対応を読み解き、数字や英字が連続して並ぶ意味を確かめます。
- 読む 約 7 分
- 最後にクイズ 1 問
メモリには、文字そのものは入らない
メモリに入るのは 0 と 1 の並びです。A という形をそのまま置くわけではありません。それでも画面に A が出るのは、「この番号はこの文字を表す」という取り決めがあるからです。
ASCIIは、英数字や記号、改行などの制御文字を合わせた128種類に、0から127の番号を割り当てます。A は65、a は97、文字の 0 は48です。見た目の形ではなく、文字に対応する番号を記録します。文字の 0 と整数の0も別のものです。
番号が連続しているから、比較に意味が出る
A から Z、a から z、0 から 9 は、それぞれ番号が連続しています。文字コードを基準に比較すると、この順番が使われます。
Python
print('a' < 'b') # True
print('Z' < 'a') # True
print(sorted(['banana', 'Apple', 'cherry']))
# ['Apple', 'banana', 'cherry']sorted は一覧を文字コードの順に並べた結果を返します。Apple が先なのは、先頭の A が65で、b の98より小さいからです。人が期待する「大文字と小文字を区別しない順番」とは違います。
現場の話 名前の一覧で大文字始まりだけが上に固まるのは、文字コードの順で並べているためです。表示の順番を決めるときは、大文字と小文字を同じように扱うかも考えます。
数字も連続するので、文字の 5 のコード53から、文字の 0 のコード48を引けば、数の5になります。引くのは文字そのものではなく、取り出した番号です。
32の差は、1ビットの差
97 − 65 = 32です。32は右から6桁目の重みでした。
プレーンテキスト
Aの65 = 1000001
aの97 = 1100001違うのは1桁です。第1章のビット操作が、英字の大文字と小文字にもつながります。ただし、この規則はASCIIの英字についての話です。記号や日本語まで同じ操作で大文字にできるわけではありません。
番号を取り出す道具も、入力の単位を確かめる
Pythonの ord は、1文字を受け取ってUnicodeの番号を返します。ASCIIの範囲では同じ番号です。ord('A') は65ですが、ord('AB') はエラーになります。
例題で確かめる
商品ラベルにある文字 7 を、個数の7として読みたいとします。数字のコードは48から順に並ぶので、7 のコードは48 + 7 = 55です。55 − 48 = 7となり、数の7が取り出せます。番号55を個数と取り違えないことが大切です。