文字数の数え方 — バイト・コードポイント・書記素の違い
更新日 2026-09-01
「この文章は何文字?」——単純そうで、実は数え方が複数あります。日本語や絵文字が入ると、ツールや言語によって結果が食い違うことがあります。その正体は「バイト」「コードポイント」「書記素」という 3 つの数え方の違いです。順番に見ていきましょう。
バイト:保存・通信のサイズ
バイトは、コンピュータがデータを保存・送信するときの大きさの単位です。文字がバイト列になるとき、UTF-8 という方式が広く使われます。UTF-8 では、半角英数字は 1 バイト、日本語の多くは 3 バイトになります。データベースのカラム上限や通信量は、文字数ではなくバイト数で決まることがあります。
コードポイント:Unicodeの番号
Unicode は、世界中の文字に一意の番号(コードポイント)を割り当てた仕組みです。「あ」や「A」はそれぞれ 1 つのコードポイントですが、絵文字や合成文字では複数のコードポイントが組み合わさることがあります。プログラムの文字列長(文字数)がこの単位で数えられることも多く、見た目の文字数とずれる原因になります。
書記素:人が見た「1文字」
書記素(グラフェムクラスタ)は、人が見て「1 文字」と感じるまとまりです。例えば家族の絵文字 👨👩👧 は複数のコードポイントで構成されますが、見た目は 1 文字なので書記素では 1 と数えます。濁点を後付けした合成文字も同様です。人間の直感に最も近い数え方がこれです。
UTF-8 と Shift_JIS
日本語でよく登場する文字コードが UTF-8 と Shift_JIS です。UTF-8 は世界中の文字を扱える現代の標準で、Web や最近のシステムの既定になっています(1 文字が 1〜4 バイト、日本語はおおむね 3 バイト)。一方 Shift_JIS は古くから日本語環境で使われてきた方式で、今も一部の CSV や古いシステムに残っています。同じ文章でもバイト列はまったく異なります。
文字ごとのバイト数を比べる
同じ「1 文字」でも、エンコーディングによってバイト数は変わります。代表的な文字を UTF-8・Shift_JIS・UTF-16 で数えると、次のようになります(当サイトで実測)。
- A(半角英字)… UTF-8: 1/Shift_JIS: 1/UTF-16: 2 バイト
- é(アクセント付きラテン)… UTF-8: 2/Shift_JIS: 変換不可/UTF-16: 2 バイト
- あ(ひらがな)… UTF-8: 3/Shift_JIS: 2/UTF-16: 2 バイト
- 漢(漢字)… UTF-8: 3/Shift_JIS: 2/UTF-16: 2 バイト
- 😀(絵文字)… UTF-8: 4/Shift_JIS: 変換不可/UTF-16: 4 バイト(サロゲートペア)
ポイントは 2 つです。日本語は UTF-8 では 3 バイト・Shift_JIS では 2 バイトと差が出ること、そして絵文字やアクセント付き文字は Shift_JIS では表せない(変換できない)ことです。バイト数で上限が決まるフォームやデータベースでは、この差がそのまま効いてきます。
文字化け(mojibake)はなぜ起きる
文字化けは、保存したときのエンコーディングと、読み込むときのエンコーディングが食い違うと起こります。たとえば UTF-8 で保存したファイルを Shift_JIS として開くと、日本語が意味不明な記号に化けます。CSV を Excel で開いたら文字化けした、という定番のトラブルの多くはこれが原因です。ファイルのエンコーディングを UTF-8 にそろえる、または開く側で正しいエンコーディングを指定することで防げます。
なぜ数がずれるのか
- 「あ」1 文字 → 書記素 1 / コードポイント 1 / バイト 3(UTF-8)
- 絵文字 😀 → 書記素 1 / コードポイント 1 / UTF-16 単位 2(サロゲートペア)
- 家族絵文字 👨👩👧 → 書記素 1 だが、コードポイントは複数
- SNS の字数制限やフォームの上限が、どの単位で数えているかは仕様次第
当サイトの文字数カウントは、書記素・コードポイント・UTF-16 単位・UTF-8 バイト数をまとめて表示するので、目的に応じた「正しい文字数」を確認できます。テキストをバイト列で運ぶ Base64 や、URL に載せる URL エンコードとあわせて理解すると、文字とバイトの関係がより腑に落ちます。