文字数カウンター
絵文字や結合文字を含む文字列を、意味のある五つの指標で同時に測ります。
入力
文字数
0コードポイント
0UTF-16 単位
0単語数
0行数
0「この文字列の長さは?」に答えが一つでない理由
ささいな質問に聞こえますが、テキストの長さは何を数えるかで完全に変わります。人は目に見える文字を数えます。データベースは値が占める保存量を数えます。JavaScript はまた別のものを数えます。これらの数値が食い違うとき — 絵文字・アクセント付き文字・非ラテン文字ではしばしばそうなります — 一つの「長さ」は誤解を招きます。このツールは意味のある五つの指標を並べて表示するので、自分の状況に合ったものを選べます。
五つの指標
- 文字数 (書記素): 人が 1 文字として知覚するものです。👨👩👧 のような絵文字の家族や、結合アクセント付きの文字も 1 文字として数えます — 「目で見て」数えるのに一致するのはこの数です。
- コードポイント: Unicode スカラー値の数です。目に見える 1 文字が複数のコードポイントを結合して作られることがあるため、この数は書記素の数より大きくなりがちです。
- UTF-16 単位: JavaScript が文字列の .length プロパティで報告する値です。基本多言語面の外にある文字 (多くの絵文字) は、それぞれ 2 つの UTF-16 単位を占めます。
- 単語数: 単語らしいトークンの数で、素朴に空白で区切るのではなく、Unicode を考慮して検出します。
- 行数: 改行ごとに数えた行の数です。
絵文字とアクセントが素朴な数え方を壊す理由
現代のテキストは Unicode で作られており、多くの目に見える文字を単一の単位ではなく並びとして表します。旗の絵文字は 2 つの地域表示記号です。家族の絵文字は、目に見えない「ゼロ幅接合子」で結ばれた複数の人です。アクセント付きの é は、単一のコードポイントのこともあれば、素の e に結合アクセントが続いたものであることもあります。どれも 1 文字に見えますが、指標によっては 2 つ・3 つ、あるいはそれ以上として数えられます。手で数えたり、一つの数を信じたりするとバグにつながるのは、まさにこのためです。
どの数を使うべきか?
- 人が目にする文字数制限 (プロフィール、ツイート風の欄、SMS のプレビュー): 文字数 (書記素) を使ってください。ユーザーが数えるものに一致します。
- JavaScript の文字列処理、配列の添字操作やスライス: UTF-16 単位を使ってください。.length と文字列の添字はこれに基づいています。
- データベースの列サイズ: 列が文字単位かバイト単位かを確認してください — 多くはバイト制限で、UTF-8 のバイト数はこれらのどの数とも異なります。
- エディター向けの単語数・行数、読みやすさの指標: 単語数と行数の指標を使ってください。
よくある質問
- JavaScript の文字列長に一致するのはどれですか?
- UTF-16 単位の値が JavaScript の生の .length プロパティに一致します。コードが文字列をスライスしたり添字で参照したりするなら、その挙動を左右するのはこの数です。
- 絵文字 1 つが複数文字として数えられるのはなぜですか?
- 多くの絵文字は複数の Unicode コードポイントを結合して作られています。書記素 (目に見えるもの) としては 1 文字ですが、コードポイント数と UTF-16 単位数はそれより大きくなります。だから各指標を分けて表示しています。
- 末尾の空白や改行も数えますか?
- はい。貼り付けたすべての文字を数えます。先頭・末尾の空白や改行も含みます。合計が思ったより大きい場合は、目に見えない末尾の空白がないか確認してください。
- 入力したテキストはどこかに送られますか?
- いいえ。数え上げはすべてブラウザ内で行われます。入力または貼り付けたテキストが端末の外に出ることはありません。
- 書記素とは何ですか?
- 書記素 (「書記素クラスター」) とは、人が知覚する文字のことです。複数の下位コードポイントから作られていても、読み手が 1 文字と呼ぶ最小の単位です。
- バイト数はこれらの数とどう違いますか?
- バイト数はエンコードによって変わります。UTF-8 では、ASCII の文字は 1 バイト、多くのアクセント付き・非ラテン文字は 2〜3 バイト、多くの絵文字は 4 バイトです。ここにある五つの指標はどれもバイト数ではないため、バイト制限のある欄では先に UTF-8 に符号化してください。