UnicodeとUTF-8の違い|コードポイントとバイト列を比較

この記事の要点

文字をUTF-8へ変換したい方へ

入力した文字のコードポイントとUTF-8バイト列を同時に確認できます。

Unicodeコード変換ツールを使う

UnicodeとUTF-8の違い

UnicodeとUTF-8は役割が異なります。Unicodeは文字にコードポイントを割り当てる規格で、UTF-8はそのコードポイントを保存・送信できるバイト列へ変換する方法です。

ひとことで区別すると

Unicode:文字の共通番号を決める
UTF-8:共通番号をバイト列で表す

比較項目UnicodeUTF-8
役割文字とコードポイントを定義コードポイントをバイト列へ符号化
表記例U+3042E3 81 82
単位コードポイントバイト
範囲・長さU+0000〜U+10FFFF1〜4バイト

「A」「あ」「😀」の変換例

コードポイントが同じでも、UTF-8とUTF-16では実際のデータ表現が変わります。以下はツールでも確認できる代表例です。

文字UnicodeUTF-8UTF-16UTF-8長
AU+00414100411バイト
U+3042E3 81 8230423バイト
U+6F22E6 BC A26F223バイト
😀U+1F600F0 9F 98 80D83D DE004バイト

UTF-8はコードポイントに応じて1〜4バイトになる

UTF-8は可変長です。ASCII範囲は1バイトでそのまま表し、より大きなコードポイントは複数バイトへ分けます。

「日本語はUTF-8で3バイト」と説明されることがありますが、すべての日本語関連文字が必ず3バイトという意味ではありません。補助平面にある文字は4バイトです。

UTF-8とUTF-16の違い

UTF-16は16ビットのコード単位を1個または2個使います。BMP内の多くの文字は1コード単位、U+10000以上の文字はサロゲートペアという2コード単位で表します。

比較項目UTF-8UTF-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などの符号化方式を選びます。

UTF-8の文字化けを防ぐ方法

文字化けは、UTF-8のバイト列をShift_JISなど別の方式として解釈したときに起こります。作成・保存・送信・受信・表示で符号化方式をそろえることが基本です。

よくある質問

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を一致させます。