UnicodeとUTF-8の違い|コードポイントとバイト列を比較
この記事の要点
- Unicodeは文字へコードポイントを割り当てる規格です。
- UTF-8はコードポイントを1〜4バイトへ変換する符号化方式です。
- WebやAPI、一般的なテキストファイルではUTF-8が広く使われます。
UnicodeとUTF-8の違い
UnicodeとUTF-8は役割が異なります。Unicodeは文字にコードポイントを割り当てる規格で、UTF-8はそのコードポイントを保存・送信できるバイト列へ変換する方法です。
Unicode:文字の共通番号を決める
UTF-8:共通番号をバイト列で表す
| 比較項目 | Unicode | UTF-8 |
|---|---|---|
| 役割 | 文字とコードポイントを定義 | コードポイントをバイト列へ符号化 |
| 表記例 | U+3042 | E3 81 82 |
| 単位 | コードポイント | バイト |
| 範囲・長さ | U+0000〜U+10FFFF | 1〜4バイト |
「A」「あ」「😀」の変換例
コードポイントが同じでも、UTF-8とUTF-16では実際のデータ表現が変わります。以下はツールでも確認できる代表例です。
| 文字 | Unicode | UTF-8 | UTF-16 | UTF-8長 |
|---|---|---|---|---|
| A | U+0041 | 41 | 0041 | 1バイト |
| あ | U+3042 | E3 81 82 | 3042 | 3バイト |
| 漢 | U+6F22 | E6 BC A2 | 6F22 | 3バイト |
| 😀 | U+1F600 | F0 9F 98 80 | D83D DE00 | 4バイト |
UTF-8はコードポイントに応じて1〜4バイトになる
UTF-8は可変長です。ASCII範囲は1バイトでそのまま表し、より大きなコードポイントは複数バイトへ分けます。
U+0000〜U+007F:1バイト。ASCIIと同じ値です。U+0080〜U+07FF:2バイト。欧文文字などを含みます。U+0800〜U+FFFF:3バイト。日本語の多くがここに含まれます。U+10000〜U+10FFFF:4バイト。一部の絵文字や追加漢字を含みます。
「日本語はUTF-8で3バイト」と説明されることがありますが、すべての日本語関連文字が必ず3バイトという意味ではありません。補助平面にある文字は4バイトです。
UTF-8とUTF-16の違い
UTF-16は16ビットのコード単位を1個または2個使います。BMP内の多くの文字は1コード単位、U+10000以上の文字はサロゲートペアという2コード単位で表します。
| 比較項目 | UTF-8 | UTF-16 |
|---|---|---|
| 単位 | 8ビットのバイト | 16ビットのコード単位 |
| 長さ | 1〜4バイト | 1〜2コード単位 |
| ASCII互換 | あり | バイト列としてはなし |
| バイト順 | 問題にならない | BE・LEの区別がある |
| 主な場面 | Web、API、ファイル、Linux | 一部OS・言語の内部表現、既存形式 |
JavaScriptの文字列長はUTF-16コード単位を基準にするため、"😀".lengthは2になります。見た目の文字数とは一致しません。
UTF-8とUnicodeはどう使い分けるか
両者は選択肢として競合するものではありません。文字を識別するときはUnicodeコードポイントを使い、ファイル保存や通信ではUTF-8などの符号化方式を選びます。
- 文字の種類や範囲を示す:
U+3042などのUnicodeコードポイント - Webページを保存する:UTF-8
- HTTP APIでJSONを送受信する:通常はUTF-8
- JavaScriptでエスケープする:
\u3042、\u{1F600} - UTF-16ベースのデータを解析する:コード単位とサロゲートペアを考慮
UTF-8の文字化けを防ぐ方法
文字化けは、UTF-8のバイト列をShift_JISなど別の方式として解釈したときに起こります。作成・保存・送信・受信・表示で符号化方式をそろえることが基本です。
- HTMLの先頭付近で
<meta charset="UTF-8">を指定します。 - HTTPの
Content-Typeでもcharset=UTF-8を明示します。 - エディタやデータベース、CSV入出力の文字コードを確認します。
- 途中で無条件に再エンコードせず、元データの符号化方式を特定します。
よくある質問
UnicodeとUTF-8は同じものですか?
同じではありません。Unicodeは文字とコードポイントの対応を定め、UTF-8はコードポイントを1〜4バイトへ符号化します。
日本語1文字はUTF-8で何バイトですか?
一般的なひらがな、カタカナ、漢字の多くは3バイトです。ただしASCII文字は1バイト、補助平面の一部の文字や絵文字は4バイトです。
UTF-8とUTF-16はどちらを使うべきですか?
WebページやAPI、一般的なテキストファイルではUTF-8が標準的です。既存システムやプログラミング環境の内部表現に合わせてUTF-16を扱う場合もあります。
UTF-8の文字化けを防ぐにはどうすればよいですか?
保存、送信、受信、表示の各段階でUTF-8を明示し、HTMLではmeta charset、HTTPではContent-Typeのcharsetを一致させます。