「あ」を10進数の文字コードで表すと、Unicodeのコードポイントなら12354(U+3042)、UTF-8のバイト値なら227 129 130という3つの数になります。HTMLに書く数値文字参照ではコードポイントのほうを使うので、「あ」はあと書きます。
どれも「あ」を正しく表した数ですが、何を数値にしているかが異なります。目的に合わない数を使うと、HTMLで別の文字が表示されたり、変換ツールで元の文字に戻らなかったりします。
- Unicodeのコードポイントは12354です。文字そのものに割り当てられた番号で、16進数ではU+3042と書きます。
- UTF-8のバイト値は227 129 130です。ファイルや通信データの中で「あ」が実際に占める3バイトを、10進数で並べたものです。
- HTMLの数値文字参照はあ、または16進数であと書きます。中に入る数はコードポイントです。
Unicodeのコードポイントは文字や記号に割り当てられた番号
Unicodeのコードポイントは、Unicodeが文字や記号に割り当てた番号で、どの文字コードで保存したかに関係なく決まっています。ただし、見た目の1文字が複数のコードポイントでできている場合もあります。通常は「U+」のあとに16進数を続けて表し、「あ」はU+3042、「日」はU+65E5です。16進数の3042を10進数に直すと12354、65E5は26085になります。
半角英数字の範囲では、コードポイントとUTF-8のバイト値が同じ数になります。たとえば「A」は、コードポイントもUTF-8のバイト値も65です。半角英数字だけで試しているうちは違いが見えず、日本語などASCII以外の文字を入れると両者の違いが分かります。
HTMLの数値文字参照はコードポイントを10進数か16進数で書く
HTMLの数値文字参照に入れる数は、UTF-8のバイト値ではなくUnicodeのコードポイントです。2026年10月29日時点で、W3Cの国際化解説ページ「Using character escapes in markup and CSS」は、数値文字参照を10進数の&#nnnn;か16進数の&#xhhhh;で書くこと、そしてその数は文書の文字コードでの値ではなく文字のUnicodeコードポイントであることを説明しています。
「あ」の場合、次の2通りの書き方があり、どちらでも同じ文字になります。
- 10進数で書く場合はあ
- 16進数で書く場合はあ(数の前に小文字のxを付けます)
同じページでは、末尾のセミコロンを省略しないよう注意を促しています。また、UTF-8のバイト値をあのように並べても「あ」にはなりません。これらはUTF-8のバイト列としてではなく、個別の数値文字参照として処理されるからです。
UTF-8のバイト数はコードポイントの範囲で1から4バイトに決まる
UTF-8では、コードポイントの範囲によって、1つのコードポイントを表すのに必要なバイト数が決まっています。日本語のかなや漢字の多くは3バイト、😀のような絵文字は4バイトです。2026年10月29日時点で、UTF-8の仕様であるRFC 3629は、範囲とバイト数を次のように定めています。
| コードポイントの範囲 | UTF-8のバイト数 | 当てはまる文字の例 |
|---|---|---|
| U+0000からU+007Fまで | 1バイト | 半角英数字(Aなど) |
| U+0080からU+07FFまで | 2バイト | ©(U+00A9、10進のバイト値は194 169) |
| U+0800からU+FFFFまで | 3バイト | ひらがな、カタカナ、漢字(あ、日、漢)、半角カナ(ア) |
| U+10000からU+10FFFFまで | 4バイト | 😀(絵文字) |
なお、U+D800からU+DFFFまではUTF-16で使うサロゲートの範囲で、RFC 3629はこれをUTF-8で符号化することを禁じています。RFC 3629には「日本語」の3文字(U+65E5、U+672C、U+8A9E)をUTF-8で表した例が載っており、16進数でE6 97 A5 E6 9C AC E8 AA 9Eの9バイトになります。1文字あたり3バイトずつ使っていることになります。
代表的な文字のコードポイントとUTF-8のバイト値
次の表は、よく使われる文字の値を2026年10月29日にPython 3で計算したものです。「日」の行は、RFC 3629の例の先頭3バイトと一致します。「UTF-8(10進)」の列は、後述の10進数変換器の出力と同じ形式です。
| 文字 | Unicode | 10進のコードポイント | UTF-8(16進) | UTF-8(10進) | HTMLの数値文字参照 |
|---|---|---|---|---|---|
| A | U+0041 | 65 | 41 | 65 | A |
| あ | U+3042 | 12354 | E3 81 82 | 227 129 130 | あ |
| 日 | U+65E5 | 26085 | E6 97 A5 | 230 151 165 | 日 |
| 漢 | U+6F22 | 28450 | E6 BC A2 | 230 188 162 | 漢 |
| ア(半角) | U+FF71 | 65393 | EF BD B1 | 239 189 177 | ア |
| 😀 | U+1F600 | 128512 | F0 9F 98 80 | 240 159 152 128 | 😀 |
10進のコードポイントとUTF-8(10進)の値が一致するのは「A」の行だけです。半角カナの「ア」は見た目こそ半角ですが、コードポイントがU+0800からU+FFFFまでの範囲にあるため、UTF-8では3バイトになります。絵文字の😀はU+10000以上なので4バイトとなり、10進数でも4つの数が並びます。これに対して、HTMLの数値文字参照は1つのコードポイントを参照1つで表します。複数のコードポイントでできた絵文字などは、参照も複数になります。
Digily Linkの10進数変換器で文字を10進数に変換する手順
Digily Linkの10進数変換器に文字を入力して「10進数に」を選ぶと、UTF-8のバイト値が10進数で表示されます。Unicodeのコードポイントが表示されるわけではないので、この点に注意してください。なお、Digily Linkは私たちが運営しているサービスで、このツールはどなたでも利用できます。
- 「10進数変換器」のページを開きます。
- 「コンテンツ」欄に、調べたい文字を入力するか貼り付けます。
- 種類で「10進数に」を選びます。
- 「送信」を押します。
- 「10進数」の欄に結果が表示されます。「あ」なら227 129 130です。
複数の文字を入力すると、すべてのバイト値が半角スペース区切りで続けて並びます。たとえば「日本」なら230 151 165 230 156 172です。どこまでが1文字かを示す区切りは入らないため、ひらがなや一般的な漢字なら3つずつ、😀のような絵文字なら4つずつをひとまとまりとして読みます。
このような出力になるのは、ツールの内部処理によるものです。ツールのコードでは、PHPのord()関数でテキストを1バイトずつ読み取り、それぞれの値の後ろに半角スペースを付けています。そのため、結果の末尾にもスペースが1つ残ります。2026年10月29日時点で、PHPマニュアルのord()は、この関数が文字コードを認識しないこと、特にUTF-8のようなマルチバイトの文字コードではUnicodeのコードポイントを判別しないことを説明しています。返すのは0から255までの1バイト分の値で、コードポイントが必要な場合はmb_ord()を使うよう案内しています。
入力欄についても1点注意があります。入力したテキストは、HTMLタグが削除され、前後の空白が取り除かれたうえで変換されます。「<b>」のようなタグを含む文字列を入力しても、タグの部分は変換結果に含まれません。
10進数をテキストに戻すときは12354ではなく227 129 130を入れる
「テキストへ」はUTF-8のバイト値を受け付ける機能です。そのため「あ」に戻したいときは、コードポイントの12354ではなく227 129 130を入力します。12354を入力すると、コードの仕組み上、「あ」ではなく「B」が出力されます。
原因は変換方法にあります。「テキストへ」は入力を半角スペース1つで区切り、数でない部分を読み飛ばしたうえで、残った数をPHPのchr()関数で1つずつ1バイトに変換しています。2026年10月29日時点で、PHPマニュアルのchr()は、0から255までの範囲外の値は255とのビット単位の論理積をとると説明しています。つまり、256で割った余りとして扱われます。
12354を256で割ると、商は48で余りは66です。66は「B」のバイト値なので、「あ」のつもりで入力した12354が「B」になってしまいます。このとき、意図した「あ」には戻りません。なお、同じPHPマニュアルによると、PHP 8.5以降ではchr()に0から255の範囲外の整数を渡すことが非推奨になっており、環境によっては警告が出ることがあります。ほかの日本語のコードポイントを入力した場合も、元の文字ではなく別の文字や読めない記号になることがあります。
| 「テキストへ」に入れる値 | 結果(コードの仕組みからの見込み) |
|---|---|
| 227 129 130 | 「あ」に戻る |
| 12354 | 256で割った余りの66として扱われ、「B」になる |
| 227,129,130 | カンマを含む部分は数として認識されず、読み飛ばされる |
数は半角スペースで区切ってください。区切りとして扱われるのは半角スペースだけなので、カンマで区切った数は読み飛ばされます。全角スペースや改行、タブで区切った場合も、意図した複数の数として処理されないことがあります。大事なデータを変換する前に、まず227 129 130で「あ」に戻るかどうかを自分の環境で試しておくと安心です。
手元にあるのがコードポイントの12354で、そこから文字に戻したい場合は、このツールではなくコードポイントを扱う方法を使います。HTMLならあと書けば「あ」と表示されます。プログラムなら、コードポイントを受け取る関数を使います。
コードポイントとUTF-8のバイト値の使い分け
文字を番号で指定するときはコードポイントを、ファイルや通信データをバイト単位で調べるときはUTF-8のバイト値を使います。場面ごとに整理すると次のとおりです。
| 場面 | 使う数 | 「あ」の例 |
|---|---|---|
| HTMLの数値文字参照を書く | コードポイント | あ または あ |
| プログラムで文字の番号を取り出す(PHPのmb_ordなど) | コードポイント | 12354 |
| UTF-8で保存されたCSVやファイルの中身をバイト単位で確かめる、文字化けの原因を探す(Shift_JISなど別の文字コードで保存されたファイルではバイト値が異なります) | UTF-8のバイト値 | 227 129 130 |
| 10進数変換器の「テキストへ」に入れる | UTF-8のバイト値 | 227 129 130 |
なお、HTMLではそもそも数値文字参照を使う必要がない場面がほとんどです。2026年10月29日時点で、先ほどのW3Cのページは、文書をUTF-8で保存して文字をそのまま書くことを基本とし、エスケープは<や&のように構文と紛らわしい文字や、目に見えない文字に限って使うよう勧めています。UTF-8で保存したHTMLなら、「あ」はあと書かずに、そのまま「あ」と書けばよいわけです。
手元の文字がUTF-8で何バイトになり、どんな値になるかを確かめたいときは、文字をUTF-8の10進数バイト値に変換する10進数変換器を使ってみてください。出力された数を「テキストへ」に入れて元の文字に戻るかを確認すれば、変換結果に入力ミスがないかも確かめられます。
よくある質問
10進数で書かれた文字コードを文字に戻すには?
まず、その数がコードポイントなのかUTF-8のバイト値なのかを見分けます。UTF-8の各バイト値は0から255までの範囲に収まるため、256以上の数が含まれていれば、それは1バイト分の値ではありません。ただし、コードポイントとは限らないので、元のデータの形式を確認してください。すべて255以下で、日本語の文章なのに3つずつまとまって並んでいる場合は、UTF-8のバイト値である可能性が高いでしょう。バイト値なら半角スペース区切りで「テキストへ」に入力し、コードポイントならHTMLの数値文字参照かコードポイント用の関数で文字に戻します。
絵文字の😀はなぜ4つの数になるのですか?
😀のコードポイントは128512(U+1F600)です。RFC 3629では、U+10000以上の文字はUTF-8で4バイトになると定められているため、バイト値で表すと240 159 152 128の4つになります。テキストに戻すときは、4つすべてを順番どおりに入力してください。一部だけでは元の絵文字になりません。
カンマ区切りで入力できますか?
「テキストへ」はカンマ区切りに対応していません。「227,129,130」のように入力すると数として認識されず読み飛ばされるので、カンマを半角スペースに置き換えてから入力してください。表計算ソフトなどからコピーした数は、タブや改行で区切られていることもあります。その場合も、半角スペース区切りに直してから入力するのが確実です。