Text / 納品前のbyte確認

長文をUTF-8 byte上限で分割し、欠落なく渡す

文字数だけでは、受け手のbyte上限に収まるか分かりません。Unicode文字を壊さず分割し、各chunkのbyte数と再結合結果を確認してから渡します。

文字数とbyte数は違う

A🙂Bは見た目の文字数が3でも、UTF-8では6 bytesです。JavaScriptのlengthだけで上限を判定すると、絵文字や日本語の境界で受け手の制限を超えることがあります。

fixture上限source byteschunk bytes再結合
ASCII464 | 2一致
日本語7156 | 6 | 3一致
emoji565 | 1一致
境界461 | 4 | 1一致

文字を途中で切らない

chunkへ次のUnicode code pointを追加したとき、UTF-8 byte数が上限以下なら追加します。超える場合は次のchunkへ送り、元のcode pointを削除・置換・途中分割しません。

const bytes = new TextEncoder().encode(part).length;
if (bytes <= limit) keep(part); else nextChunk();

実際の上限とencodingは、API・キュー・DB・ファイル形式など受け手の仕様を確認してください。

渡す前の検算

  1. 受け手のencodingとbyte上限を確認する。
  2. 各chunkのUTF-8 byte数を記録する。
  3. chunkを順番どおり連結する。
  4. 連結結果が原文と完全一致するか比較する。
  5. 上限超過や仕様不明なら送らず、確認に戻す。

このガイドはブラウザー内の静的資料です。入力・ファイル・検算結果を外部へ送信・保存しません。

上限超過は成功にしない

上限4 bytesのとき、🙂Bは5 bytesなので、そのまま有効なchunkとして渡せません。省略や無言の切り捨てではなく、分割し直すか受け手へ確認します。