テキストのバイトサイズ計算 — UTF-8、UTF-16、ASCII

UTF-8、UTF-16、ASCIIエンコーディングで任意のテキストのバイトサイズを計算します。異なる文字エンコーディングがストレージサイズに影響する仕組みと、同じテキストがエンコーディング間で異なるバイトサイズを持つ理由を学びます。

Text Metrics

詳細な説明

テキストのバイトサイズ計算

テキストのバイトサイズは使用する文字エンコーディングに完全に依存します。同じ文字列でも、UTF-8、UTF-16、ASCIIのどれでエンコードされるかによって、劇的に異なるストレージ量を占有する場合があります。

JavaScriptでのバイトサイズ計算

TextEncoder APIは正確なUTF-8バイト数を提供します:

function getByteSize(text) {
  const encoder = new TextEncoder(); // デフォルトはUTF-8
  const encoded = encoder.encode(text);
  return encoded.byteLength;
}

複数のエンコーディングの場合:

function getByteSizes(text) {
  const utf8 = new TextEncoder().encode(text).byteLength;
  const utf16 = text.length * 2; // 近似値
  const ascii = text.replace(/[^\x00-\x7F]/g, "").length;
  return { utf8, utf16, ascii };
}

エンコーディングの比較

文字 UTF-8 UTF-16 ASCII
A (U+0041) 1バイト 2バイト 1バイト
é (U+00E9) 2バイト 2バイト N/A
(U+4E16) 3バイト 2バイト N/A
絵文字 (U+1F600) 4バイト 4バイト N/A

UTF-8の可変幅エンコーディング

UTF-8は文字あたり1-4バイトを使用します:

  • 1バイト: U+0000からU+007F(ASCII互換)— 英字、数字、基本的な句読点
  • 2バイト: U+0080からU+07FF — アクセント付き文字、ギリシャ語、キリル文字、アラビア語、ヘブライ語
  • 3バイト: U+0800からU+FFFF — CJK文字、ほとんどの記号
  • 4バイト: U+10000からU+10FFFF — 絵文字、歴史的文字、楽譜

この可変幅により、英語主体のテキストではUTF-8は非常に効率的ですが、CJK主体のコンテンツではやや効率が低下します。

バイトサイズが重要な理由

  1. データベースストレージ — MySQLのVARCHAR(255)はUTF-8で255バイトを意味し、255文字より少ない場合がある
  2. APIペイロード — 多くのAPIはリクエスト/レスポンスのボディサイズを文字数ではなくバイト数で制限
  3. ファイルサイズの見積もり — テキストデータのストレージ要件の予測
  4. ネットワーク帯域幅 — バイトサイズが転送時間を決定
  5. Cookieの制限 — ブラウザのCookieは合計約4,096バイトに制限

BOM(バイトオーダーマーク)

UTF-8ファイルはBOM(\xEF\xBB\xBF、3バイト)で始まることがあります。UTF-16ファイルは \xFF\xFE または \xFE\xFF(2バイト)を使用します。これらの不可視マーカーはバイト数に加算されますが、可視文字ではありません。

ユースケース

データベースのストレージ要件を計算するバックエンド開発者は、適切なカラムタイプを選択するためにバイトサイズを使用します。APIフィールドのバイト対応制限を構築するフロントエンド開発者にも必要です。ログストレージコストを見積もるDevOpsエンジニアや、特定のエンコーディングでテキストデータを処理するETLパイプラインを設計するデータエンジニアも、正確なバイトサイズ計算に依存しています。

試してみる — Word Counter

フルツールを開く