「Hello」と入力してコンピュータが保存するとき、実際に保存されるのは数値の列 72, 101, 108, 108, 111 です。この文字と数値の対応関係がASCIIであり、テキスト処理・プロトコル設計・データ交換の仕組みを理解する鍵になります。
ASCIIとは
ASCII(American Standard Code for Information Interchange)は1963年に米国規格協会が策定した文字エンコーディング規格です。128文字(英字・数字・記号・制御コード)を0〜127の整数にマッピングし、各文字は7ビットで表現されます。
元々の設計制約は電信回線でした。転送効率のために各文字を7ビットに収める必要があったのです。1963年のこの決断が、現在あらゆるプログラミング言語のテキスト処理に影響を与え続けています。
ASCIIの範囲:
- 0〜31:制御文字(非表示)
- 32〜126:表示可能文字(英字・数字・記号・スペース)
- 127:DEL(削除制御文字)
ASCII文字セット全体は7ビットに収まりますが、コンピュータはバイト(8ビット)単位でデータを扱います。余った8ビット目を使って、Latin-1やコードページなどの拡張エンコーディングが後から追加されました。
ASCII文字テーブルの重要ポイント
制御文字(0〜31)
デバイス制御やテキスト整形に使われる非表示文字です:
| 十進 | 十六進 | 略称 | 意味 |
|---|---|---|---|
| 0 | 00 | NUL | ヌル文字 |
| 7 | 07 | BEL | ベル(端末ビープ) |
| 8 | 08 | BS | バックスペース |
| 9 | 09 | HT | 水平タブ |
| 10 | 0A | LF | 改行(Unix改行 \n) |
| 13 | 0D | CR | キャリッジリターン(\r) |
| 27 | 1B | ESC | エスケープ(ANSIエスケープシーケンス) |
CR+LF(\r\n)の組み合わせ——十進で13と10——はWindowsの行末文字です。CR(印字ヘッドを行頭に戻す)とLF(紙を1行送る)という機械式テレタイプの動作がそのまま引き継がれています。
表示可能文字(32〜126)
32 スペース 48 0 65 A 97 a
33 ! 49 1 66 B 98 b
34 " 50 2 67 C 99 c
...
プログラミングで覚えておくべき値:
| 文字 | 十進 | 十六進 |
|---|---|---|
| スペース | 32 | 20 |
0 | 48 | 30 |
A | 65 | 41 |
a | 97 | 61 |
Z | 90 | 5A |
z | 122 | 7A |
大文字と小文字の差は常に32(0x20)です。ASCIIバイトの5ビット目を反転させると大小文字が切り替わります。パフォーマンス重視のパーサーで今でも使われるテクニックです。
数字の0〜9は48から始まるので、'5' - 48 = 5 でASCII数字文字を整数値に変換できます。文字列を整数に変換するカスタムパーサーの基礎です。
ASCII・Unicode・UTF-8の違い
この3つは混同されがちです。関係を整理します:
ASCII は128文字をカバーする7ビットエンコーディングです。英語向けに設計されており、非ラテン文字は含みません。
Unicode はあらゆる書記体系のすべての文字に固有のコードポイントを割り当てた規格です——Unicode 15.1時点で149,000文字以上。Unicodeはエンコーディングではなく文字セットです。U+0041 は「A」のコードポイントを表します。数値がどの文字を意味するかを定義しますが、バイト列での格納方法は規定しません。
UTF-8 はUnicodeコードポイントをバイト列にエンコードする方式の一つです。可変長エンコーディングです:
- コードポイント0〜127(ASCII範囲全体)は1バイト——ASCIIと完全に同一
- コードポイント128〜2047は2バイト
- コードポイント2048〜65535は3バイト
- コードポイント65535超は4バイト
重要な点:UTF-8はASCIIの上位互換です。純粋なASCIIドキュメントはそのまま有効なUTF-8ドキュメントです。
他のUnicodeエンコーディング:
- UTF-16:1文字あたり2または4バイト。Windows・Java・JavaScriptの内部文字列表現として使われます。ASCII互換ではありません。
- UTF-32:1文字あたり固定4バイト。シンプルですが、主にASCIIのコンテンツには非効率です。
- Latin-1(ISO 8859-1):ASCIIの8ビット拡張で、128〜255に西ヨーロッパ言語文字を追加します。UTF-8とよく混同されますが、127以上の文字は互換性がありません。
コードでASCIIを扱う
JavaScript
// 文字からASCIIコードへ
'A'.charCodeAt(0); // 65
'a'.charCodeAt(0); // 97
' '.charCodeAt(0); // 32
// ASCIIコードから文字へ
String.fromCharCode(65); // 'A'
String.fromCharCode(72, 101, 108, 108, 111); // 'Hello'
// 文字列をASCIIコードの配列に変換
function toAsciiCodes(str) {
return [...str].map(c => c.charCodeAt(0));
}
toAsciiCodes('Hello'); // [72, 101, 108, 108, 111]
// ASCII大文字かどうかチェック
function isUpperCase(char) {
const code = char.charCodeAt(0);
return code >= 65 && code <= 90;
}
// ビット演算で大小文字を切り替え
function toggleCase(char) {
return String.fromCharCode(char.charCodeAt(0) ^ 32);
}
toggleCase('A'); // 'a'
toggleCase('a'); // 'A'
Python
# 文字からASCIIコードへ
ord('A') # 65
ord('\n') # 10
ord(' ') # 32
# ASCIIコードから文字へ
chr(65) # 'A'
chr(72) # 'H'
# 文字列からコードのリストへ
[ord(c) for c in 'Hello'] # [72, 101, 108, 108, 111]
# コードから文字列へ
''.join(chr(c) for c in [72, 101, 108, 108, 111]) # 'Hello'
# ASCII範囲かチェック
def is_ascii(s: str) -> bool:
return all(ord(c) < 128 for c in s)
# Python 3の組み込みメソッド
'Hello'.isascii() # True
'Héllo'.isascii() # False
Go
package main
import "fmt"
func main() {
// 文字からコードポイント(rune)へ
r := 'A'
fmt.Println(int(r)) // 65
// コードポイントから文字へ
fmt.Printf("%c\n", 65) // A
// 文字列のバイトを反復(ASCII範囲)
for i, b := range []byte("Hello") {
fmt.Printf("%d: %c = %d\n", i, b, b)
}
// 0: H = 72
// 1: e = 101
// ...
// XORで大小文字を切り替え
fmt.Printf("%c\n", 'A'^32) // a
fmt.Printf("%c\n", 'a'^32) // A
}
ASCIIコードの実用的な用途
プロトコルの区切り文字
多くのインターネットプロトコルはASCIIベースで設計されています。HTTPヘッダー・SMTPコマンド・FTP制御メッセージ・CSVファイルはすべてASCII文字を区切り文字として使用します:
- CSVは
,(44)と\r\n(13, 10)を使用 - HTTPヘッダーは
\r\n\r\n(13, 10, 13, 10)で終端 - SMTPコマンドは
\r\nで終端するプレーンASCII行 - CのNUL終端文字列はNUL(0)を文字列終端として使用
ターミナル制御シーケンス
ESC文字(27、\x1b)は、ターミナル出力に色やカーソル移動を追加するANSIエスケープコードの基礎です:
# ターミナルで赤いテキスト
print('\x1b[31mこれは赤です\x1b[0m')
# 太字テキスト
print('\x1b[1mこれは太字です\x1b[0m')
# カーソルを3行上に移動
print('\x1b[3A')
ソートと比較
ASCII順序が文字列比較の動作を決定します。大文字(65〜90)が小文字(97〜122)より前に来て、数字(48〜57)は両方より前に来ます。ほとんどの言語で 'Z' < 'a' が真になる理由はここにあります——'Z' は90で 'a' は97です。
データエンコーディング
バイナリデータをASCIIのみのチャネル(メール・HTTP・URL)で送る必要がある場合、ASCII安全な表現にエンコードします。Base64はA〜Z・a〜z・0〜9・+・/を使用。パーセントエンコーディングはバイトを %XX の16進数シーケンスに変換します。
オンラインでASCIIに変換
ZeroToolのASCIIコンバーターは、任意のテキストをASCIIの十進・十六進・二進表現にリアルタイムで変換し、コードからテキストへの逆変換も可能です。表示可能なASCII範囲全体に対応し、クイックリファレンス用の文字テーブルも表示します——インストール不要。