日本語が3バイトになる理由 — 文字コードとバイト数の話
コラムUTF-8の仕組みと、バイト数が実務に影響する場面を解説
文字数カウントツールを使うと、英字と日本語でバイト数が異なることに気づきます。英字「A」は1バイトなのに、ひらがな「あ」は3バイト——なぜ文字によってバイト数が違うのでしょうか。
この違いは文字コード(エンコーディング)の仕組みによるものです。特に現在最も広く使われている UTF-8 の特性を理解することで、文字数とバイト数の違いが見えてきます。
文字コードとは
コンピュータは文字をそのまま扱えません。すべての文字に番号(コードポイント)を割り当て、その番号をバイト列として保存する仕組みが「文字コード」です。
最も古い文字コードのひとつが ASCII(アスキー)です。英字・数字・記号など128種類の文字を7ビット(1バイト)で表します。「A」は65番、「a」は97番、「0」は48番というように割り当てられています。英語圏の文書はこれで十分でしたが、日本語・中国語・アラビア語など世界の言語を扱うには全く足りませんでした。
UTF-8の仕組み
世界中のすべての文字を統一的に扱うために作られたのが Unicode という規格です。Unicodeはひらがな・漢字・絵文字を含む140万種以上の文字にコードポイントを割り当てています。
UTF-8はそのUnicodeを実際にバイト列に変換する方式のひとつで、可変長エンコーディングという仕組みを採用しています。コードポイントの大きさに応じて1〜4バイトを使い分けます。
| 文字の種類 | 例 | UTF-8のバイト数 |
|---|---|---|
| ASCII文字(英数字・記号) | A、0、! | 1バイト |
| ラテン拡張・キリル文字など | é、ñ、Ж | 2バイト |
| ひらがな・カタカナ・漢字・韓国語 | あ、ア、漢、한 | 3バイト |
| 絵文字・一部の漢字(CJK拡張) | 😀、𠮷 | 4バイト |
ひらがな「あ」のUnicodeコードポイントはU+3042です。この値は2バイトでは表現できる範囲を超えているため、UTF-8では3バイトを使って表現します。
バイト数が実務に影響する場面
- APIのリクエストサイズ制限:多くのAPIは「バイト数」で上限を設けています。日本語のテキストは文字数の3倍のバイト数になるため、文字数だけを見て制限以内と判断すると超過することがあります。
- データベースの設計:MySQLのVARCHAR(255)は「文字数」ではなく「バイト数」で管理されることがあります。utf8mb4では1文字最大4バイトのため、VARCHAR(255)に入れられる日本語は最大63文字になる場合があります。
- ファイルサイズの見積もり:日本語のテキストファイルは英文と比べて同じ文字数でも3倍近いサイズになります。
- SMS・メッセージングAPIの文字制限:SMSはUCS-2エンコーディングを使うことが多く、日本語は1文字2バイトとして70文字が1通の上限になるケースがあります。
関連ツール
文字数カウント →