文字数カウンター
スペースあり・なしのリアルタイム文字数、バイトサイズ、そしてツイートやmeta descriptionなど一般的なプラットフォームの上限にどれだけ近いかを表示します。
よくある上限
仕組み
キー入力のたびに、ページは3つの数値を再計算します。文字数は JavaScript の .length で、UTF-16 コードユニット数をカウントします。スペースなしのカウントは、まず正規表現ですべての空白(スペース、タブ、改行)を取り除きます。バイトサイズはブラウザの TextEncoder API にテキストを通し、そのテキストがファイルやデータベースの列、HTTPリクエストボディで実際に占める UTF-8 バイト数を算出します。プラットフォームの上限リストは、各上限との単純な引き算で、上限を超えた瞬間に「超過」スタイルに切り替わります。
これらの数値の差こそが落とし穴です。スマイリーのような絵文字は見た目には1つの記号ですが、UTF-16 では2コードユニット(そのためここでも多くのプラットフォームでも2文字としてカウントされます)、UTF-8では4バイトになります。特にSMSでは、160文字という上限は、メッセージが従来のGSM-7文字セット内に収まることを前提としています。絵文字1つやカーブした「スマート引用符」を1つ含めるだけで、キャリアはメッセージ全体を黙ってUCS-2エンコーディングに切り替え、セグメントあたりの上限が70文字まで下がります。1文字編集しただけで突然SMSが2セグメントに分かれてしまうのは、これが理由です。
カウントはすべてこのページのJavaScript内で行われます。入力中に開発者ツールのネットワークタブを開いてみてください。リクエストは一切発生しません。テキストがブラウザの外に出ることはないからです。