文字数
テキストに含まれる文字の総数。スペースや改行を含むかどうかは文脈によって異なる。
文字数とは、テキストを構成する文字の総数を指します。日本語では 1 つのひらがな、カタカナ、漢字がそれぞれ 1 文字としてカウントされ、英語ではアルファベット 1 文字が 1 文字です。スペースや改行、句読点を含めるかどうかは文脈によって異なり、この「何を 1 文字と数えるか」という定義の違いが、文字数カウントを複雑にしている根本的な要因です。
文字数のカウント方法は利用場面ごとに大きく異なります。X (Twitter) の上限 280 は文字数ではなく重みの合計で、半角英数字は 1、日本語や絵文字は 2 と数えられるため、日本語だけで書けば実質 140 文字です。Google の検索広告の見出しは 30 文字ですが、これは半角を 1 として数えた枠であり、日本語や中国語のように 2 文字幅で表示される文字は 1 文字が 2 と数えられるため、実質 15 文字までしか入りません。メタディスクリプションには公式の文字数上限がなく、日本語で 120 文字前後という数字が実務の目安として共有されているだけです。レポートや論文では「空白を除く文字数」が求められることも多く、同じテキストでもカウント結果が変わります。数え始める前に、その枠が半角基準なのか重み基準なのか、空白を含むのかを確認するのが順序です。
プログラミングにおける文字数カウントには技術的な落とし穴があります。JavaScript の String.length は UTF-16 コードユニット数を返すため、サロゲートペアで表現される絵文字や一部の漢字を 2 文字として数えます。正確な文字数を得るには [...str].length のようにスプレッド構文を使う方法がありますが、これでも結合文字を含む書記素クラスタは正しくカウントできません。Intl.Segmenter を使えば、人間が認識する「見た目の 1 文字」単位で正確にカウントできます。家族を表す絵文字は 4 人ぶんの絵文字を ZWJ でつないだ見た目 1 文字ですが、String.length では 11、スプレッド構文でも 7 と数えられ、書記素クラスタ単位に区切って初めて 1 になります。国旗の絵文字も同様に 4 と 2 と 1 に分かれます。どの数え方を使うかは、上限を決めている相手側の数え方に合わせるのが原則で、自前の表示だけを人間の感覚に寄せると入力欄の残り文字数と投稿先の判定がずれます。
よくある誤解として、「文字数」と「バイト数」の混同があります。UTF-8 では日本語 1 文字が 3 バイト、ASCII 文字が 1 バイトを消費するため、同じ文字数でも言語によってデータサイズは大きく異なります。データベースの VARCHAR 定義やファイルサイズの見積もりでは、文字数ではなくバイト数を基準にする必要がある場面も少なくありません。
多言語のシステムでは、文字数と表示幅を別のものとして扱う必要があります。文字数が少ないほうが横幅も狭いとは限りません。英語の「desktop」は 7 文字、日本語の「デスクトップ」は 6 文字で文字数はむしろ減りますが、日本語は 1 文字が 2 文字幅で表示されるため、実際の横幅は英語より広がります。逆に、ボタンやラベルのような短い文字列は、ヨーロッパの言語へ訳すと文字数が 2 倍以上に伸びることが珍しくありません。文字数上限を全言語で同じ値に固定すると、ある言語では余り、別の言語ではあふれます。翻訳を伴う画面では、文字数の上限は言語ごとに決め、最終的な確認は文字数ではなく実際の表示幅で行います。
文字数を確認する道具を使うときは、表示されている値がどの数え方によるものかを合わせて見ます。同じテキストでも、空白を含めるか、全角を 2 と数えるか、書記素単位で数えるかで結果は変わります。提出先や投稿先の枠と同じ数え方の値を見ながら書けば、書き終えてから削る手戻りが起きません。