「日」は E6 97 A5: 文字が UTF-8 で占めるバイト
UTF-8 の16進数変換とは、文字をコンピューターが実際に保存する UTF-8 のバイトに直し、1バイトを 00〜FF の2桁の16進数で書き表すことです。「日」のコードポイント(Unicode での文字の番号)は U+65E5 で、UTF-8 では E6 97 A5 の3バイトになります。英字の A は 41 の1バイト、絵文字の 😀 は F0 9F 98 80 の4バイトです。逆に、ログやプログラムから受け取った E6 97 A5 を入れれば、「日」に戻せます。
上の変換ツールは、テキストの欄も16進数の欄も直接書き換えられます。書き換えたほうが基準になり、真ん中の帯には1文字ずつ、その文字のバイトが字幕のように付きます。帯の下の色は1・2・3・4バイトの区別で、文字を押すと「ビットルーペ」が、コードポイントのビットが UTF-8 のどの位置に入るかを描きます。16進数の書き方はスペース区切り・続けて書く・0x 配列・\x エスケープ・% エンコードの五つで、貼り付けるときはこの五つをすべて読み取ります。
UTF-8 のバイトを直接見たい場面
- 文字化けして、元の文字コードを調べたいとき: UTF-8 の日本語は、漢字もひらがなも多くが E3〜E9 で始まる3バイトです。Shift_JIS では全角が2バイトで、半角カナは1バイトです。化けた文字の元のバイトを16進数で入れると、UTF-8 として読めるか、読めなければ Shift_JIS では何になるかを並べて表示します。
- ログに \xE6\x97\xA5 のような値が出たとき: Python は bytes の値を表示するとき、ASCII 以外のバイトを b'\xe6\x97\xa5' のように \x エスケープで書きます。この値をそのまま16進数の欄に貼ると、外側の b'…' やそのまま書かれた英字も読み取って、元の文に戻します。
- DB に保存しようとしてエラーになったとき: MySQL の utf8mb3(以前の名前は utf8)は1文字が最大3バイトなので、4バイトの絵文字は保存できません。エラー 1366 のメッセージには Incorrect string value: '\xF0\x9F\x98\x80' のように、問題の値がバイトで出ます。この部分を入れると、😀 が4バイトの1文字だったのでだめだったと、すぐ分かります。
- 見た目は同じなのに、比較や検索が合わないとき: 改行しないスペース(C2 A0)、幅のないスペース(E2 80 8B)、ファイル先頭の BOM(EF BB BF)は画面に見えませんが、バイトは違います。帯には NBSP・ZWSP・BOM などのラベルで表示します。全角スペース(E3 80 80)も通常のスペース(20)とはまったく別のバイトです。
- ファイル名の濁点が分かれてしまったとき: Mac の HFS Plus(Mac OS 拡張)のボリュームは、ファイル名を NFD の変種で保存します。NFD にすると「ガ」が「カ」と濁点(U+3099)の2文字に分かれるため、「ガイド.pdf」は13バイトではなく19バイトになります。NFC にまとめると何バイトになるかも、変換ツールが知らせます。
- URL の中の %E6%97%A5 を読むとき: URL に日本語を入れるときは、まず UTF-8 に変え、バイトごとに % と2桁の16進数で書きます。アドレスバーからコピーした %E6%97%A5%E6%9C%AC%E8%AA%9E を入れると、「日本語」が出ます。
- コードに文字列をバイト配列として入れるとき: 組み込み機器や通信仕様に文字を送るには、0xE6, 0x97, 0xA5 のような配列が必要です。形式を「0x 配列」にすれば、そのまま貼り付けられる形で書き出します。
使い方
- テキストの欄に文を入れるか、16進数の欄にバイトを貼り付けます。最初の画面には日本語・英字・絵文字の例が入っています。上の「例」ボタンで、見えない文字、濁点が分かれた形、ログの \x バイト、文字化けのバイトも入れられます。
- 間の矢印が変換の向きを示します。テキストの欄を書き換えると下向き(エンコード)、16進数の欄を書き換えると上向き(デコード)に変わります。
- 16進数の形式と、大文字・小文字を選びます。16進数を入れたあとで形式を変えると、同じバイトを新しい形式で書き直します。
- 真ん中の帯で文字を押すか、欄でカーソルを動かすと、ビットルーペにその文字のコードポイント・UTF-8・UTF-16・Shift_JIS のバイトと、バイト位置が出ます。
- 「16進数をコピー」か「テキストをコピー」で結果を持ち出します。右下では、同じ文を UTF-16 や Shift_JIS で保存したときのバイト数を比べられます。
UTF-8 が文字をバイトに分ける規則
UTF-8 は、Unicode の範囲 U+0000〜10FFFF の文字を1〜4バイトで書く方式です(RFC 3629)。先頭バイトの上位ビットが何バイトの文字かを示し、続くバイトはすべて 10 で始まります。そのため、バイトを1つ見るだけで、それが文字の始まりなのか途中なのかが分かります。
| コードポイントの範囲 | バイト数 | ビットの形 | 例 |
|---|---|---|---|
| U+0000〜007F | 1 | 0xxxxxxx | A → 41 |
| U+0080〜07FF | 2 | 110xxxxx 10xxxxxx | é → C3 A9, Ω → CE A9 |
| U+0800〜FFFF | 3 | 1110xxxx 10xxxxxx 10xxxxxx | 日 → E6 97 A5, 語 → E8 AA 9E |
| U+10000〜10FFFF | 4 | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx | 😀 → F0 9F 98 80 |
「日」を自分で分けてみます。U+65E5 を2進数で書くと 0110 0101 1110 0101 の16ビットです。3バイトの枠には 4 + 6 + 6 ビットの空きがあるので、0110 / 010111 / 100101 に分けて、11100110、10010111、10100101 に入れます。この3バイトが16進数で E6、97、A5 です。U+0000〜007F は1バイトのままなので、英数字と記号だけの文は ASCII とバイトが完全に同じになります。
ひらがな・カタカナ・ほとんどの漢字は U+0800〜FFFF に入るので、UTF-8 では常に3バイトです。そのため「こんにちは」の5文字は15バイトになります。一方、半角カナは UTF-8 では3バイトのままですが、Shift_JIS では1バイトで済みます。「カ」は UTF-8 で EF BD B6、Shift_JIS では B6 です。
文字ごとの UTF-8・UTF-16・Shift_JIS のバイト
| 文字 | コードポイント | UTF-8 | UTF-16 | Shift_JIS |
|---|---|---|---|---|
| A | U+0041 | 41 | 0041 | 41 |
| é | U+00E9 | C3 A9 | 00E9 | なし |
| Ω | U+03A9 | CE A9 | 03A9 | 83 B6 |
| € | U+20AC | E2 82 AC | 20AC | なし |
| 日 | U+65E5 | E6 97 A5 | 65E5 | 93 FA |
| 語 | U+8A9E | E8 AA 9E | 8A9E | 8C EA |
| あ | U+3042 | E3 81 82 | 3042 | 82 A0 |
| ガ | U+30AC | E3 82 AC | 30AC | 83 4B |
| カ(半角) | U+FF76 | EF BD B6 | FF76 | B6 |
| ゙(半角の濁点) | U+FF9E | EF BE 9E | FF9E | DE |
| 結合用の濁点 | U+3099 | E3 82 99 | 3099 | なし |
| 😀 | U+1F600 | F0 9F 98 80 | D83D DE00 | なし |
| 全角スペース | U+3000 | E3 80 80 | 3000 | 81 40 |
| 改行しないスペース | U+00A0 | C2 A0 | 00A0 | なし |
| BOM | U+FEFF | EF BB BF | FEFF | なし |
| ZWJ(結合子) | U+200D | E2 80 8D | 200D | なし |
同じ文でも、文字コードによってバイト数が変わる
| 文 | 見た目の文字 | コードポイント | UTF-8 | UTF-16 | Shift_JIS |
|---|---|---|---|---|---|
| Hello | 5 | 5 | 5 | 10 | 5 |
| 日本語 | 3 | 3 | 9 | 6 | 6 |
| こんにちは | 5 | 5 | 15 | 10 | 10 |
| ガイド(半角) | 3 | 5 | 15 | 10 | 5 |
| ガイド.pdf | 7 | 7 | 13 | 14 | 10 |
| café | 4 | 4 | 5 | 8 | é なし |
| 日本語 Hi! 😀 | 9 | 9 | 18 | 20 | 😀 なし |
| 👨👩👧(家族) | 1 | 5 | 18 | 16 | なし |
英字だけなら UTF-8 がいちばん短く、日本語は UTF-8 が Shift_JIS の1.5倍になります。ただし Shift_JIS は日本語の外の文字をすべては収められません。é や 😀 のように表にない文字は保存できないため、複数の言語や絵文字が混ざるウェブでは UTF-8 が使われます。半角カナの「ガイド」は、濁点が独立した1文字なので見た目は3文字でもコードポイントは5個あり、UTF-8 では15バイト、Shift_JIS では5バイトです。家族の絵文字は画面では1文字ですが、人の絵文字3つ(4バイト × 3)を ZWJ 2つ(3バイト × 2)でつないだものなので、18バイトになります。
16進数の五つの書き方
| 形式 | 書き方 | 主な使い道 |
|---|---|---|
| スペース区切り | E6 97 A5 E6 9C AC E8 AA 9E | ダンプ(16進数表示)のソフト、文書やログにバイトを書くとき |
| 続けて書く | E697A5E69CACE8AA9E | Python の bytes.hex() の結果、ハッシュやキーのような続けた値 |
| 0x 配列 | 0xE6, 0x97, 0xA5, 0xE6, 0x9C, 0xAC, 0xE8, 0xAA, 0x9E | C・Java・JavaScript のバイト配列 |
| \x エスケープ | \xE6\x97\xA5\xE6\x9C\xAC\xE8\xAA\x9E | Python の bytes の表示、C の文字列、MySQL のエラーメッセージ |
| % エンコード | %E6%97%A5%E6%9C%AC%E8%AA%9E | URL |
貼り付けるときは、形式を選ばなくても構いません。スペース・タブ・改行・カンマ・コロン・ハイフンを区切りとして読むので、.NET の BitConverter.ToString が出す E6-97-A5 もそのまま入ります。\x と % の形式では、その間にそのまま書かれた英数字もバイトとして読み取り、外側の b'…'・"…"・[…] も外します。パーセントエンコードは大文字の16進数が推奨されていますが(RFC 3986)、大文字と小文字は同じバイトです。
// JavaScript: 文 → UTF-8 の16進数
[...new TextEncoder().encode('日本語')].map(b => b.toString(16).padStart(2, '0')).join(' '); // 'e6 97 a5 e6 9c ac e8 aa 9e'
# Python 3.8 以上: 文 ↔ 16進数
'日本語'.encode('utf-8').hex(' ') # 'e6 97 a5 e6 9c ac e8 aa 9e'
bytes.fromhex('E6 97 A5 E6 9C AC E8 AA 9E').decode('utf-8') # '日本語'(スペースは無視)
UTF-8 として読めないバイト
すべてのバイト列が UTF-8 とは限りません。続きのバイトが先頭なしで現れる、文字が途中で切れる、もっと短く書ける文字をわざと長く書く、といったものは不正な UTF-8 です。RFC 3629 は、サロゲートの領域(U+D800〜DFFF)を UTF-8 で書くことを禁じ、デコーダーが C0 80 のような長い形(overlong)を受け入れてはならないと警告しています。ブラウザーは不正な部分ごとに置換文字 �(U+FFFD)を1つ入れますが、この変換ツールも同じ規則で区切り、帯にエラーのバイトと理由を表示します。
| バイト | 理由 | 表示される文字 |
|---|---|---|
80 | 10xxxxxx は続きのバイトなのに、先頭のバイトがない | � |
FF | F5〜FF は UTF-8 で使われないバイト | � |
C0 80 | U+0000 を2バイトに伸ばした長い形(C0・C1 は常に禁止) | �� |
E0 80 80 | E0 の後ろに来られるのは A0〜BF だけ(長い形) | ��� |
ED A0 80 | U+D800 のサロゲートの領域(ED の後ろは 80〜9F だけ) | ��� |
F4 90 80 80 | U+10FFFF を超える(F4 の後ろは 80〜8F だけ) | ���� |
E2 28 A1 | 3バイトの文字が2バイト目で切れ、28 は「(」として別に読む | �(� |
E6 97 | 「日」の最後のバイトが抜けている | � |
最後の2行のように切れた文字は、そこまで正しく届いたバイトをまとめて � 1つに置き換えます。Unicode ではこれを「最大の部分列(maximal subpart)」の置換と呼んでいて、同じバイトを入れれば、ブラウザーとこの変換ツールの � の数は一致します。16進数の欄に入力している最中は、最後の文字が途中でも誤りとは見なさず、残りのバイト数を知らせます。欄から離れた時点で、エラーと判定します。
文字化けの形から元の文字コードを推測する
文字化けの最大の原因は、ある文字コードで保存したバイトを別の文字コードで読むことです。化け方にはくせがあるので、見た目から、どちらの向きで読み違えたのかを推測できます。
| 元のバイト | 読み違えた方式 | 表示される形 |
|---|---|---|
UTF-8「文字化け」 E6 96 87 E5 AD 97 E5 8C 96 E3 81 91 | Shift_JIS | 譁�ュ怜喧縺� |
UTF-8「日本語」 E6 97 A5 E6 9C AC E8 AA 9E | Shift_JIS | 譌・譛ャ隱� |
UTF-8「ガイド」 E3 82 AC E3 82 A4 E3 83 89 | Shift_JIS | 繧ャ繧、繝� |
Shift_JIS「文字化け」 95 B6 8E 9A 89 BB 82 AF | UTF-8 | �������� |
Shift_JIS「日本語」 93 FA 96 7B 8C EA | UTF-8 | ���{�� |
Shift_JIS「ガイド」 83 4B 83 43 83 68 | UTF-8 | �K�C�h |
表の「譁�ュ怜喧縺�」や「譌・譛ャ隱�」のように、見慣れない漢字に半角カナ(ュ・ャ・・など)や � が混ざるときは、UTF-8 のバイトを Shift_JIS として読んだ場合に当たります。一方、� が並ぶなかに K・C・h や { のような半角の英数字・記号だけが残るときは、Shift_JIS のバイトを UTF-8 として読んだ場合です。「本」は 96 7B で、後ろの 7B が { として読まれ、「ガイド」の 83 4B・83 43・83 68 は後ろのバイトだけが K・C・h として残ります。原因が分かったら、元のバイトを16進数の欄に入れてください。変換ツールは UTF-8 として読み、読めなければ Shift_JIS で読んだ結果を下に併記します。例の「文字化けのバイト」を押すと、95 B6 8E 9A 89 BB 82 AF が Shift_JIS では「文字化け」だと確かめられます。
間違えやすい点
- 数値を16進数に変える計算だと思う: テキストの欄に 255 を入れても FF にはならず、数字の文字「2」「5」「5」のバイト 32 35 35 が出ます。数の基数を変えたいときは、基数変換ツールを使います。
- コードポイントと UTF-8 のバイトを混同する: U+65E5 は「日」の番号で、E6 97 A5 はその番号を UTF-8 で保存したバイトです。16進数の欄に U+65E5 や 日 を入れると、バイトではないという案内が出ます。
- 全角と半角のバイトを同じだと考える: 全角の「A」は U+FF21 で UTF-8 では EF BC A1 の3バイト、半角の「A」は U+0041 で 41 の1バイトです。見た目が似ていても、検索や照合では別の文字として扱われます。
- 16進数への変換を暗号化だと思う: 16進数はバイトの書き方にすぎず、誰でも元の文に戻せます。パスワードや個人情報を隠す目的で使ってはいけません。
- ファイル先頭の EF BB BF を消すべきか迷う: EF BB BF は UTF-8 の BOM(U+FEFF)で、先頭に付くと「UTF-8 のファイル」という目印の役目だけを果たします。Unicode FAQ は、ファイルが ASCII の文字で始まることを前提にするバイト指向のプロトコルでは BOM を避けるよう述べ、一方で Microsoft の .txt の慣習のように BOM を求める場合もあると説明しています。受け取る側が BOM をどう扱うかを確かめてから、残すか消すかを決めてください。
- Windows の改行 0D 0A を期待する: ブラウザーの入力欄は改行を LF(0A)にして保持します。テキストの欄で打った改行は 0A なので、CR(0D)を含むバイトを確かめたいときは16進数の欄に 0D 0A を入れてください。
- 文字数とバイト数を同じに見る: 長さの上限がバイトで決まっている欄では、日本語10文字は30バイトと数えられます。帯の上の「文字・コードポイント・バイト」の3つの数字を合わせて見てください。
できないこと
- 変換はブラウザーの中だけで行い、入力した文やバイトをサーバーへ送ったり、URL や保存領域に残したりしません。
- テキストは一度に UTF-16 で 100,000 桁、16進数は区切りを含めて 1,200,000 桁まで変換します。帯は先頭の 1,500 個の文字・エラーバイトまで描き、残りは変換とコピーにだけ含まれます。
- 16進数の出力は UTF-8 のバイトだけです。UTF-16 と Shift_JIS は、バイト数の比較とルーペの文字ごとの値としてだけ表示します。
- Shift_JIS の値はブラウザーの WHATWG Encoding の表に従うため、古いソフトが使う表とは一部の文字が異なる場合があります。
- 元の文を自動では正規化しません。濁点が分かれた形(NFD)の文は知らせるだけで、「NFC にまとめる」を押したときに初めて変えます。
- 画像や圧縮ファイルのような任意のバイナリファイルは扱いません。ファイルを文字に直したいときは Base64 のツールを使ってください。
- % エンコードを読むとき、+ は空白にせず + の文字(2B)として扱います。フォームのデータのように + が空白を表す値は、URL エンコーダー・デコーダーを使ってください。
出典
基準: UTF-8 の規則は RFC 3629 と Unicode 18.0 コア仕様の第3章、ブラウザーのエンコード・デコードと shift_jis の表は WHATWG Encoding Standard、そのほかの形式やエラーメッセージは各文書で、2026年10月21日に確認しました。UTF-8 のバイトの規則は RFC 3629 以降変わっていません。
- 01RFC 3629 — UTF-8, a transformation format of ISO 10646U+0000〜10FFFF を1〜4バイトで表す、サロゲートの禁止、C0 80 の長い形への警告、BOM は EF BB BF
- 02The Unicode Standard 18.0 — 第3章 Conformance表 3-7 正しい UTF-8 のバイト列、3.9.6 最大の部分列の U+FFFD への置換
- 03WHATWG — Encoding StandardUTF-8 デコーダー、TextDecoder の fatal・ignoreBOM、shift_jis のラベルに windows-31j・ms932 を含む
- 04Unicode — UTF-8, UTF-16, UTF-32 & BOM FAQ先頭の BOM はシグネチャ。ASCII で始まる前提のバイト指向プロトコルでは避け、BOM を求める慣習もある
- 05RFC 3986 — URI Generic Syntax2.1 パーセントエンコードは大文字の16進数を推奨、2.5 UTF-8 に変えてからパーセントエンコード
- 06MySQL 8.4 — The utf8mb3 Character Set1文字最大3バイト、BMP の文字のみ(補助文字は非対応)、utf8 は非推奨の別名
- 07MySQL 8.4 — Server Error Message Referenceエラー 1366 ER_TRUNCATED_WRONG_VALUE_FOR_FIELD: Incorrect %s value: '%s' for column
- 08Python 3 — Built-in Types: bytesbytes.fromhex は ASCII の空白を無視、bytes.hex(sep) は 3.8 から、ASCII 以外のバイトは \x エスケープ
- 09Microsoft Learn — BitConverter.ToStringハイフンで区切った16進数のペア。例: "7F-2C-4A-00"
- 10MDN — TextEncoderJavaScript の文字列を常に UTF-8 にエンコードする
- 11Unicode Technical Standard #51 — Unicode Emoji改訂 31(Emoji 18.0)、ZWJ でつないだ絵文字シーケンス
- 12Unicode Standard Annex #15 — Normalization Forms改訂 58、NFD は正準分解、NFC は正準分解のあと正準合成
- 13Apple Technical Q&A QA1173 — Text Encodings in VFSHFS Plus(Mac OS 拡張)はファイル名に NFD の変種を使う
よくある質問
日本語の1文字は UTF-8 で何バイトですか?
ひらがな・カタカナ・ほとんどの漢字は UTF-8 で3バイトです。たとえば「日」は E6 97 A5、「あ」は E3 81 82 です。同じ文字が Shift_JIS では2バイトで、半角カナだけは Shift_JIS で1バイト、UTF-8 では3バイトです。濁点が分かれた形(NFD)の「ガ」は「カ」と濁点の2文字になり、6バイトになります。
\xe6\x97\xa5 や %E6%97%A5 のような値を文字に直すには?
16進数の欄にそのまま貼り付けてください。変換ツールは \x エスケープ・% エンコード・0x 付き・スペースやカンマ・コロン・ハイフン区切りをすべて読み取り、外側の b'…' やそのまま書かれた英字も一緒に読んで、テキストの欄に「日」を表示します。
16進数の大文字と小文字は違う値ですか?
いいえ。E6 と e6 は同じバイト(10進数の230)です。出力は大文字と小文字から選べ、URL のパーセントエンコードには RFC 3986 が大文字を推奨しています。
「UTF-8 として読めないバイト」と表示されたらどうすればよいですか?
バイトが途中で欠けているか、もともと別の文字コードで保存された文かもしれません。変換ツールは最初のエラーが何バイト目かとその理由を示し、Shift_JIS で読めればその結果も下に併記します。たとえば 95 B6 8E 9A 89 BB 82 AF は UTF-8 としては読めませんが、Shift_JIS では「文字化け」です。
MySQL で Incorrect string value: '\xF0\x9F\x98\x80' というエラーが出るのはなぜですか?
F0 9F 98 80 は絵文字 😀 の UTF-8 の4バイトです。MySQL の utf8mb3(以前の名前は utf8)は1文字が最大3バイトのため、このような4バイトの文字は保存できません。絵文字を保存するには、列の文字セットを最大4バイトの utf8mb4 に変える必要があります。
絵文字が1つなのに、なぜ18バイトになるのですか?
👨👩👧 のような家族の絵文字は画面では1文字に見えますが、人の絵文字3つ(各4バイト)を、幅のない結合子 ZWJ 2つ(各3バイト)でつないだものです。そのためコードポイントは5個、UTF-8 は18バイトになります。帯では ZWJ が別のラベルとして表示されます。
EF BB BF とは何ですか?
UTF-8 の BOM(バイトオーダーマーク、U+FEFF)です。ファイルの先頭に付いて「UTF-8 の文」という目印の役目をし、画面には見えません。変換ツールはこのバイトを消さず、帯に BOM のラベルで表示します。残すかどうかは、受け取るソフトが BOM をどう扱うかで決めてください。
数字の 255 を入れると FF になりますか?
いいえ。この変換ツールは数の基数を変えるのではなく、文字を UTF-8 のバイトに変えます。255 は数字の文字「2」「5」「5」なので、32 35 35 になります。255 を16進数の FF にしたいときは、基数変換ツールを使ってください。