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バイトを両方出しておくと切り分けしやすくなります。

関連するツール・早見表

関連する分野

参考情報