BlueprintLab Deep Guide
「1文字」なのに数が合わない? 文字数・Unicode・UTF-8バイトの違い
見た目の1文字、Unicodeのコードポイント、JavaScriptの長さ、UTF-8バイト数は同じとは限りません。上限チェックの前に、何を数えているのかを確認します。
文字数って、実は1種類ではないんです
「100文字以内」と書かれていたら、100個の文字を数えればよさそうですよね。英数字だけならだいたい素直なんですが、日本語や絵文字が入ると話が少し変わります。
見た目では1文字でも、内部では複数のコードポイントからできていることがあります。さらにUTF-8では、日本語1文字が複数バイトになります。何を上限にしているかで見る数字が変わるんです。
日本語は、UTF-8では1文字=1バイトではありません
ASCIIの英数字はUTF-8で多くが1バイトですが、ひらがなや漢字は一般に複数バイトです。APIやDBが「最大1000 bytes」と書いているなら、1000文字入るとは限りません。
逆に「最大1000 characters」なら、バイト数だけ見ても判断できません。仕様に書かれている単位をそのまま見るのが近道です。
絵文字は、見た目1個でも中身が複数のことがあります
家族の絵文字や肌色指定付きの絵文字などは、複数のUnicode要素を組み合わせて1つに見せている場合があります。JavaScriptの`.length`と、人が見た“1文字”が一致しないことがあるのはこのためです。
バグというより、数えている単位が違うんですよ。
サービス独自ルールもあります
SNS、広告、フォーム、DBには独自の数え方があります。改行を含める、URLを一定長として数える、絵文字の扱いを変える、といったルールです。
なのでBlueprintLabの文字数と相手サービスの表示が違ったら、まず「どちらが間違い?」ではなく「数え方が違う?」と考えると切り分けやすくなります。
迷ったら、文字数とUTF-8バイトの両方を見る
仕様が曖昧なときは、文字数、コードポイント、UTF-8バイトを並べて見ておくと原因が見えやすくなります。特にAPIやCSV連携では、バイト数の上限に当たっているケースがあるんです。
「何文字?」ではなく「何の上限?」から考えます
文字数が合わないとき、カウンターを変えて試すより、相手が何を制限しているのかを見る方が早いです。フォームの100文字、APIの1000 bytes、DBのVARCHAR。名前は似ていても単位が違います。
上限の単位が分かれば、見るべき数字も決まります。分からない場合は、文字数とUTF-8バイトを両方出しておくと切り分けしやすくなります。