「文字数は10文字なのに、バイト数は30バイトになるのはなぜ?」――文字数とバイト数は似ているようで異なる概念です。この記事では、文字数とバイト数の違いと、エンコーディング方式による違いをわかりやすく解説します。
文字数とバイト数の違い
文字数とは
文字数は「文字の個数」です。日本語でも英語でも、1文字は1文字としてカウントされます。
例: 「こんにちは」→ 5文字、「Hello」→ 5文字
バイト数とは
バイト数は「データのサイズ」です。コンピューターが文字をデータとして保存する際に必要な容量を表します。
重要なポイント: 文字によって必要なバイト数が異なります。
| 文字の種類 | UTF-8でのバイト数 | Shift-JISでのバイト数 |
|---|---|---|
| 半角英数字(A, 1, @) | 1バイト | 1バイト |
| 半角カナ(ア, イ) | 3バイト | 1バイト |
| 全角ひらがな(あ, い) | 3バイト | 2バイト |
| 全角カタカナ(ア, イ) | 3バイト | 2バイト |
| 漢字(山, 川) | 3バイト | 2バイト |
| 絵文字(😀) | 4バイト | 非対応 |
つまり、同じ5文字でも:
- 「Hello」→ UTF-8で5バイト
- 「こんにちは」→ UTF-8で15バイト
エンコーディングとは
エンコーディング(文字コード)は、文字をコンピューターが処理できるデータ(バイト列)に変換するルールです。代表的なエンコーディングを紹介します。
UTF-8
現在最も広く使われているエンコーディングです。世界中のほぼすべての文字を表現できます。
- 特徴: 英数字は1バイト、日本語は3バイト
- 用途: Webサイト、プログラミング、メール(現在の標準)
- メリット: 世界中の文字に対応、英語が1バイトで効率的
Shift-JIS
日本語向けに開発されたエンコーディングです。
- 特徴: 英数字は1バイト、日本語は2バイト
- 用途: 古い日本語システム、CSVファイル(Excel用)
- メリット: 日本語のバイト効率が良い(UTF-8の3バイトに対して2バイト)
UTF-16
Windowsの内部処理で使われるエンコーディングです。
- 特徴: ほとんどの文字が2バイト
- 用途: Windows内部、Java
- メリット: 固定長で処理しやすい
バイト数が重要になる場面
データベースの設計
データベースのカラムには「VARCHAR(255)」のようにバイト数の上限が設定されます。UTF-8では日本語1文字が3バイトなので、255バイトのカラムには日本語で最大85文字しか入りません。
入力フォームの制限
一部のWebフォームでは、文字数ではなくバイト数で入力制限がかけられています。特に古い銀行システムや行政システムでは、Shift-JISベースのバイト数制限が使われていることがあります。
メールの件名
メールの件名にはRFC上の文字数制限があり、特に日本語メールではバイト数が重要になります。
CSVファイルの作成
Excelで開くCSVファイルはShift-JISエンコーディングが一般的です。UTF-8のCSVをExcelで開くと文字化けする場合があります。
バイト数の確認方法
sakuttoの文字数カウントツールでは、テキストのバイト数を3つのエンコーディングで同時に確認できます。
- UTF-8 バイト数: Webサイトやプログラミングで参照
- Shift-JIS バイト数: 古いシステムやExcel向けCSVで参照
- UTF-16 バイト数: Windows内部処理で参照
「全角半角」とバイト数の関係
日本では「全角」「半角」という概念がよく使われますが、これはバイト数と深い関係があります。
| 区分 | Shift-JISでのバイト数 | 例 |
|---|---|---|
| 半角 | 1バイト | A, 1, ア |
| 全角 | 2バイト | A, 1, ア, あ, 漢 |
この「半角1バイト、全角2バイト」の対応はShift-JISに基づくもので、UTF-8ではこの対応関係は成り立ちません。
よくある質問(FAQ)
なぜ日本語はUTF-8で3バイトなのですか?
UTF-8は英数字(ASCII)を1バイトで効率的に表現することを優先した設計になっています。日本語や中国語などのCJK文字は使用頻度が低いため、3バイトの範囲に割り当てられています。
Shift-JISとUTF-8、どちらを使うべきですか?
現在のWeb開発やプログラミングではUTF-8が標準です。Shift-JISはExcelで開くCSVファイルや、レガシーシステムとの連携で使用します。新規開発ではUTF-8を選びましょう。
絵文字のバイト数はいくつですか?
UTF-8では絵文字は4バイトです。Shift-JISでは絵文字を表現できません。なお、合成絵文字(肌の色変更など)は複数のコードポイントを組み合わせるため、さらに多くのバイト数を消費します。
バイト数制限のあるフォームで効率的に入力するには?
バイト数を節約するには、全角文字を半角に変換する方法があります。例えば全角数字「123」(UTF-8で9バイト)を半角「123」(3バイト)にするだけで6バイト削減できます。
まとめ
文字数とバイト数は異なる概念で、エンコーディング方式によってバイト数は変わります。UTF-8では日本語1文字が3バイト、Shift-JISでは2バイトです。sakuttoの文字数カウントツールなら、複数のエンコーディングのバイト数を同時に確認できます。