文字数とバイト数の違い|UTF-8・Shift_JIS のカウント方法
プログラミングやデータベース設計において、「文字数」と「バイト数」の違いを正確に理解することは不可欠です。日本語のように 1 文字が複数バイトで表現される言語では、この違いを見落とすとデータの切り詰めや文字化けといった深刻な問題を引き起こします。この記事では、主要なエンコーディングにおける文字数とバイト数の関係を詳しく解説します。文字数の確認には 文字カウンタス をご利用ください。
文字数とバイト数の基本的な違い
文字数はテキストに含まれる文字の個数を指し、バイト数はそのテキストをコンピュータが保存する際に必要なデータ量を指します。英語のアルファベットは 1 文字 = 1 バイトですが、日本語ではエンコーディングによって 1 文字あたりのバイト数が異なります。
| エンコーディング | 半角英数字 | ひらがな・カタカナ | 漢字 | 絵文字 |
|---|---|---|---|---|
| UTF-8 | 1 バイト | 3 バイト | 3 バイト | 4 バイト |
| Shift_JIS | 1 バイト | 2 バイト | 2 バイト | 非対応 |
| EUC-JP | 1 バイト | 2 バイト | 2 バイト | 非対応 |
| UTF-16 | 2 バイト | 2 バイト | 2 バイト | 4 バイト |
たとえば「こんにちは」という 5 文字のテキストは、UTF-8 では 15 バイト、Shift_JIS では 10 バイトになります。同じ文字数でもエンコーディングによってバイト数が大きく異なる点に注意が必要です。
UTF-8 の仕組みと特徴
UTF-8 は現在の Web 標準エンコーディングであり、世界中の文字を扱えるユニバーサルな文字コードです。可変長エンコーディングを採用しており、文字によって 1〜4 バイトを使い分けます。
- ASCII 文字 (英数字・記号): 1 バイト
- ラテン文字の拡張、ギリシャ文字など: 2 バイト
- 日本語 (ひらがな・カタカナ・漢字): 3 バイト
- 絵文字、一部の特殊文字: 4 バイト
UTF-8 の利点は ASCII との後方互換性にあります。英語のテキストはそのまま 1 バイトで表現されるため、既存の英語圏のシステムとの互換性が保たれます。
Shift_JIS と EUC-JP の特徴
Shift_JIS と EUC-JP は、日本語専用のエンコーディングとして長年使われてきました。現在は UTF-8 への移行が進んでいますが、レガシーシステムやメール送信では依然として使用されるケースがあります。
| 特徴 | Shift_JIS | EUC-JP |
|---|---|---|
| 主な用途 | Windows 環境、レガシーシステム | UNIX/Linux 環境 |
| 日本語 1 文字のバイト数 | 2 バイト | 2 バイト |
| 絵文字対応 | 非対応 | 非対応 |
| 多言語対応 | 日本語のみ | 日本語のみ |
| 現在の推奨度 | 非推奨 (レガシー用途のみ) | 非推奨 (レガシー用途のみ) |
実務で注意すべきポイント
文字数とバイト数の違いは、以下のような実務場面で問題を引き起こすことがあります。
- データベースのカラム定義: VARCHAR(255) が「255 文字」なのか「255 バイト」なのかは DBMS によって異なる。MySQL の utf8mb4 では 255 文字 = 最大 1,020 バイト
- API のリクエストサイズ制限: 多くの API はバイト数で制限を設けている。日本語テキストは英語の約 3 倍のバイト数を消費する
- SMS の文字数制限: 日本語 SMS は 70 文字 (全角) が 1 通の上限。半角英数字のみなら 160 文字まで送信可能
- ファイルサイズの見積もり: テキストファイルのサイズは文字数ではなくバイト数で決まる
- 文字列の切り詰め処理: バイト数で切り詰めると、マルチバイト文字の途中で切れて文字化けが発生する
| テキスト例 | 文字数 | UTF-8 バイト数 | Shift_JIS バイト数 |
|---|---|---|---|
| Hello | 5 | 5 | 5 |
| こんにちは | 5 | 15 | 10 |
| Hello こんにちは | 11 | 21 | 16 |
| 🎉🎊🎈 | 3 | 12 | 非対応 |
プログラミング言語ごとの文字数カウント
プログラミング言語によって、文字列の「長さ」が何を返すかは異なります。開発時にはこの違いを正確に把握しておく必要があります。
- JavaScript:
String.lengthは UTF-16 のコードユニット数を返す。絵文字は 2 としてカウントされる場合がある - Python 3:
len()は Unicode コードポイント数を返す。バイト数はlen(s.encode('utf-8'))で取得 - Java:
String.length()は UTF-16 のコードユニット数。codePointCount()でコードポイント数を取得 - Go:
len()はバイト数を返す。文字数はutf8.RuneCountInString()で取得
文字数とバイト数の違いを正しく理解することは、データの整合性を保ち、予期しないバグを防ぐための基本です。テキストの文字数やバイト数を手軽に確認したい場合は、文字カウンタス をぜひご活用ください。