コンピュータは数字しか扱えない。じゃあ「あ」や「A」はどうやって表現する? 答えは 「文字に番号を振って、その番号を 2 進数で記録する」。この番号付けの規格が 文字コード です。
1. 文字コードの歴史
| 時期 | 代表規格 | 特徴 |
|---|---|---|
| 1960 年代 | ASCII | 英数字 + 記号、1 文字 = 7 ビット (128 文字) |
| 1980 年代 | Shift_JIS / EUC-JP | 日本語対応、1 文字 = 1-2 バイト |
| 1990 年代 | Unicode 提唱 | 世界中の文字を 1 つの規格で |
| 2000 年代以降 | UTF-8 普及 | Web 標準、後方互換性◎ |
| 現代 | UTF-8 + 絵文字 | 毎年新しい絵文字追加、約 15 万文字 |
2. UTF-8 と Shift_JIS で「あ」を見比べる
Python で文字コードを変換
Python
# 「あ」を UTF-8 でバイト列にprint("あ".encode("utf-8"))# → b'\xe3\x81\x82' (3 バイト)
# 「あ」を Shift_JIS でバイト列にprint("あ".encode("shift_jis"))# → b'\x82\xa0' (2 バイト)
# 16 進で見やすくprint("あ".encode("utf-8").hex()) # 'e38182'print("あ".encode("shift_jis").hex()) # '82a0'
# Unicode コードポイントprint(ord("あ")) # 12354print(hex(ord("あ"))) # '0x3042'
# 絵文字も同じprint("😀".encode("utf-8").hex()) # 'f09f9880' (4 バイト)print(hex(ord("😀"))) # '0x1f600'3. なぜ文字化けが起きるか
保存時と読込み時の文字コードが違う と、バイト列を別の文字コードと解釈してしまい、無関係な文字が表示されます。
わざと文字化けを起こす
Python
# 「こんにちは」を UTF-8 で保存text = "こんにちは"data = text.encode("utf-8")
# Shift_JIS として読もうとすると...try: print(data.decode("shift_jis")) # ↓ 文字化け or エラーexcept UnicodeDecodeError as e: print("読めませんでした:", e)
# 逆: Shift_JIS で保存したものを UTF-8 で読むdata_sjis = text.encode("shift_jis")print(data_sjis.decode("utf-8", errors="replace"))# → 文字化け文字 (U+FFFD) で埋められる4. 現代では UTF-8 が標準
- Web 標準: HTML / JSON / API はほぼ UTF-8
- Python 3 のデフォルト: ファイル読み書きも UTF-8 が前提
- Linux / macOS のデフォルト: 環境変数 LANG=ja_JP.UTF-8
- Windows もメモ帳: 11 から UTF-8 がデフォルトに
- Excel CSV だけは要注意: UTF-8 BOM 付きじゃないと文字化け
5. プログラマが守るべき 5 つのルール
- 1HTML は `<meta charset="UTF-8">` を必ず入れる
- 2Web API のレスポンスヘッダに `Content-Type: application/json; charset=utf-8`
- 3データベースは `utf8mb4` (絵文字対応版) を使う
- 4ファイル I/O: `open(file, encoding='utf-8')` を明示する
- 5Excel CSV: 出力時に BOM 付き UTF-8 で保存
6. 次の話
EP.04 では CPU の仕組み に進みます。「数値や文字をどうやって計算しているのか」、コンピュータの心臓部を覗きます。
この記事の感想を教えてください
あなたの 1 クリックで、本当にこの記事は更新されます。「もっと詳しく」「続編希望」が一定数集まった記事は、 ふくふくが 実際に内容を拡充したり続編記事を公開 します。 送信したリアクションはお使いのブラウザに記録され、再カウントされません。