UTF-8 とは
この記事は約 4 分で読めます。
Web ページ、API、メールヘッダ、データベース。現代の文字エンコーディングの事実上の標準が UTF-8 です。Unicode のコードポイントを 1〜4 バイトの可変長で表現する仕組みで、ASCII との下位互換性を持ちながら、 絵文字を含む全 Unicode 文字を扱えます。普段意識しないところで、デジタル文字の流通基盤として機能しています。
定義
UTF-8 (8-bit Unicode Transformation Format) は、Unicode コードポイントをバイト列に変換するエンコーディング方式の 1 つです。 Ken Thompson と Rob Pike が 1992 年に設計し、その後 RFC 3629 として標準化されました。 Unicode 全範囲 (U+0000 から U+10FFFF) を 1 文字あたり 1 〜 4 バイトの可変長で表現します。
バイト構造
| コードポイント範囲 | バイト数 | 例 |
|---|---|---|
| U+0000 - U+007F | 1 バイト | ASCII (a, A, 0, !) |
| U+0080 - U+07FF | 2 バイト | ラテン拡張、ギリシャ、キリル |
| U+0800 - U+FFFF | 3 バイト | 日本語、中国語、韓国語 |
| U+10000 - U+10FFFF | 4 バイト | 絵文字、古代文字、補助漢字 |
ASCII との互換性
UTF-8 の重要な設計上の特徴は、ASCII (U+0000 - U+007F) を 1 バイトでそのまま表現することです。 英数字や半角記号だけで書かれたファイルは、ASCII としても UTF-8 としても同じバイト列で解釈されます。 既存の ASCII テキスト処理ツールが UTF-8 ファイルを破壊せずに扱える後方互換性が、Web での普及を後押ししました。
UTF-16 / UTF-32 との比較
| 方式 | 1 文字 | 主な用途 | 絵文字の扱い |
|---|---|---|---|
| UTF-8 | 1〜4 バイト | Web, API, ファイル | 4 バイトで表現 |
| UTF-16 | 2 または 4 バイト | Java, JS の内部表現 | サロゲートペアで 4 バイト |
| UTF-32 | 4 バイト固定 | 内部処理 (まれ) | 4 バイト固定 |
Web の標準としての地位
W3C は HTML5 で文字エンコーディングを UTF-8 と推奨し、現代の Web ページの 98% 以上が UTF-8 で配信されています。 HTTP ヘッダ、JSON、XML、メール本文、ファイル名、URL の percent-encoding まで、Web の至るところで UTF-8 が前提です。 新規開発で UTF-8 以外を選ぶ理由はほぼありません。
BOM (Byte Order Mark)
UTF-8 のファイル先頭に EF BB BF という 3 バイトの BOM を付ける運用がありますが、 Web 標準では UTF-8 BOM は推奨されません。BOM 付き UTF-8 は古い Windows 系ツール (メモ帳など) で生成されますが、 Linux / Mac のツールや Web サーバーでは想定外のバイトとして扱われ問題を起こすことがあります。 新規ファイルは BOM なしで保存するのが現代の運用です。
実務での注意点
- 文字数とバイト数の混同: 日本語 1 文字は UTF-8 で 3 バイト、絵文字は 4 バイト。バイト数で長さを判断するとマルチバイト文字が混乱の元になる
- データベースの文字セット: MySQL の
utf8は実は 3 バイトまでしか扱えない不完全実装。絵文字を扱うならutf8mb4を選ぶ - URL エンコード: 日本語や絵文字を URL に含めると、UTF-8 のバイト列を percent-encoding で符号化することになる
- ファイル読み込み: 文字コードを誤って Shift_JIS で開くと文字化けする (古い CSV など)
よくある誤解
- ❌ 「UTF-8 は 8 ビット固定」→ ✅ 8 ビットを最小単位とする可変長
- ❌ 「UTF-8 のほうが UTF-16 より遅い」→ ✅ 内容と処理依存。日本語多用なら UTF-16 が短い場面もある
- ❌ 「BOM は必須」→ ✅ UTF-8 では BOM なしが標準的