バイト数
テキストデータをエンコーディングした際のバイト単位のサイズ。文字コードによって同じ文字でもバイト数が異なる。
バイト数とは、テキストデータをコンピュータ上で表現する際に必要なバイト (8 ビット) の総数です。文字数とバイト数は根本的に異なる概念であり、同じテキストでもエンコーディング方式によってバイト数は大きく変わります。たとえば「文字」という 2 文字のテキストは、UTF-8 では 6 バイト、Shift_JIS では 4 バイト、UTF-16 では 4 バイト (BOM を除く) になります。この違いを理解することは、ソフトウェア開発やデータ管理の基礎として不可欠です。
UTF-8 における各文字のバイト数は、文字の種類によって 1 バイトから 4 バイトまで変動します。ASCII 文字 (半角英数字・記号) は 1 バイト、ラテン文字の拡張 (アクセント付き文字など) は 2 バイト、日本語のひらがな・カタカナ・漢字や中国語の漢字は 3 バイト、絵文字のように基本多言語面 (BMP) の外にある文字は 4 バイトです。一方、Shift_JIS では日本語は 2 バイト、GBK では中国語は 2 バイトで表現されます。UTF-16 ではほとんどの文字が 2 バイトですが、BMP 外の文字はサロゲートペア (2 個のコードユニット) で表されるため 4 バイトになります。「サロゲートペア」は UTF-16 側の仕組みの名前で、UTF-8 の 4 バイト表現とは別物です。同じ文字を指していても、どの方式で数えているのかを混ぜないよう注意します。
実務でバイト数が問題になる場面は多岐にわたります。データベースの文字列型では、桁数の指定が文字数なのかバイト数なのかが製品ごとに異なります。MySQL の VARCHAR(M) の M は文字数の指定ですが、行の最大サイズ 65,535 バイトという別の制約はバイト単位で効くため、utf8mb4 (1 文字あたり最大 4 バイト) では VARCHAR で取れる文字数が実質 16,000 文字強まで下がります。文字数指定でも内部の効き方はバイトである、という二段構えを押さえておかないと、定義は通るのに行サイズ超過で作成に失敗する、という詰まり方をします。API のリクエスト・レスポンスのサイズ上限もバイト単位で決められるのが普通で、マネージドサービスでは数 MB 単位の固定上限が課されることが多く、日本語を多く含む JSON は同じ文字数でも英語の 3 倍近いサイズになります。メールの添付ファイルサイズ制限や SMS の 1 通あたりの容量 (140 オクテット) も、すべてバイト数に基づいています。URL の長さについては HTTP の仕様に絶対的な上限は定められておらず、RFC 9110 が「送信側・受信側とも最低 8,000 オクテットの URI を扱えることが推奨される」と述べているだけで、実際の頭打ちはブラウザや Web サーバー、間に挟まる機器の設定で決まります。
よくある誤解として、「文字数を数えればバイト数も分かる」という思い込みがあります。日本語と英語が混在するテキストでは、文字数からバイト数を正確に算出することは困難です。たとえば「Hello 世界」は 8 文字ですが、UTF-8 では英字 5 バイト + 半角スペース 1 バイト + 漢字 6 バイトで 12 バイトになります (Shift_JIS なら 10 バイト)。区切りの半角スペースのような目立たない 1 バイトも積み上がるため、暗算ではなく実際にエンコードして測るのが確実です。プログラミング言語によっても文字列の内部表現が異なり、JavaScript の string.length は UTF-16 コードユニット数を返すため、サロゲートペアを含む文字では文字数と一致しません。正確なバイト数を取得するには、JavaScript では new TextEncoder().encode(str).length、Python では len(str.encode('utf-8')) を使います。
バイト数の上限に収めるための切り詰めは、最も事故が起きやすい処理です。UTF-8 は 1 文字が複数バイトにまたがるため、指定バイト数で機械的に切ると末尾の文字が途中で断ち切られ、その 1 文字が化けたり不正なバイト列になったりします。3 バイトの漢字が並ぶ日本語を 100 バイトで切れば、33 文字目までで 99 バイトなので、34 文字目の 1 バイト目だけが残って切断されます。安全側に寄せるなら、エンコードしたうえで切断位置が文字の境界かどうかを判定し、境界でなければ 1 文字ぶん手前まで戻します。切り詰めが必要な場面では、あわせて末尾に「…」を付けるかどうかも上限の内側で計算しておきます (「…」自体も UTF-8 で 3 バイトを消費します)。
文字数カウントツールにおいて、バイト数の表示は文字数と並んで重要な指標です。ユーザーがテキストを入力した際に、文字数だけでなくバイト数もリアルタイムで表示することで、データベースへの格納可否や API の制限内に収まるかどうかを即座に判断できます。特に多言語テキストを扱う場面では、文字数とバイト数の乖離が大きくなるため、両方の値を把握することがデータの切り詰めや文字化けの防止に直結します。