同じ文章でも、UTF-8、UTF-16、Shift_JIS、EUC-JPではバイト数が変わります。たとえば「あ」は文字数では1文字ですが、UTF-16では2バイト、UTF-8では3バイト、EUC-JPでは多くの場合2バイトとして扱われます。フォームの入力制限、CSV連携、旧システムへの登録、APIの上限チェックでは、この違いを理解しておかないと「文字数は足りているのに送信できない」という問題が起きます。
この記事では、文字数カウントツールで表示されるUTF-16バイト数とEUC-JPバイト数の見方を、実務で迷いやすい例に絞って解説します。UTF-8やShift_JISとの違いを知りたい場合は、先に「Shift_JISとUTF-8の違い」もあわせて読むと流れがつかみやすくなります。
1. まず結論:文字数とバイト数は別物
文字数は、人が画面上で見る「文字の数」を数える考え方です。一方、バイト数は、その文字列を特定の文字コードで保存・送信するときに必要なデータ量を数えます。つまり、同じ「こんにちは」でも、どの文字コードで表すかによってバイト数が変わります。
| 見る指標 | 意味 | 使う場面 |
|---|---|---|
| 文字数 | 文章として何文字あるか | レポート、SNS投稿、タイトル、原稿用紙換算 |
| UTF-16バイト数 | 16ビット単位で表すUnicode系のデータ量 | JavaScript文字列、Javaや一部DB、絵文字を含む文字列の確認 |
| EUC-JPバイト数 | 日本語UNIX環境で使われてきた文字コードでのデータ量 | 旧システム、古いCSV、レガシーDB、文字化け調査 |
2. UTF-16バイト数の数え方
UTF-16は、Unicode文字を16ビットのコードユニットで表すエンコーディング方式です。基本的な日本語、英数字、記号の多くは1つの16ビットコードユニットで表せるため、1文字あたり2バイトとして数えられます。
ただし、絵文字や一部の漢字など、Unicodeの補助文字に入る文字は、UTF-16ではサロゲートペアという2つの16ビットコードユニットで表します。そのため、見た目は1文字でも4バイトになることがあります。
| 文字 | 見た目の文字数 | UTF-16の目安 | 注意点 |
|---|---|---|---|
A |
1文字 | 2バイト | ASCIIでもUTF-16では基本的に2バイト |
あ |
1文字 | 2バイト | ひらがな・カタカナ・一般的な漢字も多くは2バイト |
𠮷 |
1文字 | 4バイト | サロゲートペアで表される異体字 |
😀 |
1つの絵文字 | 4バイト | 多くの絵文字はサロゲートペア |
3. EUC-JPバイト数の数え方
EUC-JPは、日本語UNIX環境で広く使われてきた日本語向け文字コードです。現在のWebではUTF-8が主流ですが、古い業務システム、研究機関のデータ、古いCSV、過去のデータベースではEUC-JPが残っていることがあります。
EUC-JPでは、ASCII文字は1バイト、日本語の多くの全角文字は2バイトで表されます。一方、半角カタカナや補助的な文字集合は扱いが異なり、実際のエンコード処理では2バイトまたは3バイトになるケースがあります。さらに、EUC-JPで表現できない文字は、変換時に置換されたりエラーになったりします。
| 文字の種類 | EUC-JPの目安 | 実務上の注意 |
|---|---|---|
| 半角英数字 | 1バイト | ASCIIとして扱える |
| ひらがな・カタカナ・一般的な漢字 | 多くは2バイト | 日本語本文ではShift_JISと近いバイト数になることが多い |
| 半角カタカナ | 実エンコードでは2バイトになることがある | 単純な「半角だから1バイト」とは限らない |
| 絵文字・一部の異体字 | 表現できない場合がある | 置換文字になり、元の文字情報が失われる可能性がある |
4. UTF-8・UTF-16・Shift_JIS・EUC-JPの比較
日本語の文字数チェックでは、UTF-8だけでなく、UTF-16やShift_JIS、EUC-JPも見ると、システムごとの制限に気づきやすくなります。特に「日本語は何バイトか」という質問は、文字コードを指定しないと答えが変わります。
| 文字コード | 半角英数字 | 一般的な日本語 | 絵文字・補助文字 | 主な用途 |
|---|---|---|---|---|
| UTF-8 | 1バイト | 多くは3バイト | 多くは4バイト | Web、API、現代的なシステム |
| UTF-16 | 2バイト | 多くは2バイト | 多くは4バイト | JavaScript内部表現、Java、一部DBやWindows系API |
| Shift_JIS | 1バイト | 多くは2バイト | 表現できない場合がある | Windows系レガシー、古いCSV、業務システム |
| EUC-JP | 1バイト | 多くは2バイト | 表現できない場合がある | UNIX系レガシー、古い日本語データ |
5. バイト数チェックでよくあるミス
文字数だけ見てフォーム上限を判断する
「100文字以内」と書かれているフォームでも、実際にはデータベース側で「300バイト以内」のような制限がある場合があります。この場合、全角文字や絵文字を多く含む文章は、文字数では余裕があってもバイト数で超過することがあります。
半角カタカナを必ず1バイトだと思い込む
Shift_JISでは半角カタカナを1バイトとして扱えるケースがありますが、EUC-JPでは実エンコード時に2バイトになることがあります。レガシーシステムに半角カナを渡す場合は、対象の文字コードで実際に何バイトになるかを確認してください。
絵文字を1文字として数える
SNSやチャットでは絵文字は見た目上1文字に見えますが、UTF-16では4バイトになることが多く、UTF-8でも4バイトになることがあります。絵文字や異体字が多い文章では、文字数とバイト数の差が大きくなります。
6. mojisucount.comで確認するときの見方
mojisucount.comでは、入力した文章について、文字数だけでなくUTF-8、UTF-16、Shift_JIS、EUC-JPのバイト数も確認できます。まずは通常の文字数を見て、次に提出先やシステムの仕様に合わせて必要な文字コードのバイト数を確認してください。
- WebフォームやAPIなら、まずUTF-8バイト数を見る。
- JavaScriptや絵文字を含む文字列長のズレを見るなら、UTF-16バイト数を見る。
- 日本の古いWindows系システムなら、Shift_JISバイト数を見る。
- 古いUNIX系データやEUC-JP指定のCSVなら、EUC-JPバイト数を見る。
ただし、レガシー文字コードは実装や変換ライブラリによって扱いが変わることがあります。業務システムに投入する最終データは、相手システムと同じ文字コード・同じ変換方式で確認するのが安全です。
7. 参考情報
- Unicode FAQ: UTF-8, UTF-16, UTF-32 & BOM
- The Unicode Standard, Chapter 5: Handling Surrogate Pairs in UTF-16
- WHATWG Encoding Standard
- IANA Character Sets
8. まとめ
- ✓ UTF-16では一般的な文字は2バイト、絵文字や一部の異体字は4バイトになる。
- ✓ EUC-JPでは半角英数字は1バイト、日本語の多くは2バイトだが、半角カナや未対応文字に注意が必要。
- ✓ 「日本語は何バイトか」は文字コードによって答えが変わる。必ず対象システムのエンコーディングに合わせて確認する。