アップロードなし, 100%ローカル, アカウントなし

記事

単語、文字数、大文字小文字:テキストのカウントは実際どう動いているか

テキストを数えることはコンピューターが絶対に間違えない仕事のように思えますが、同じ段落に対して2つのツールが平気で違う数字を返すことがあり、絵文字ひとつでSMSの上限が70文字に変わり、Xの「280文字」も見た目どおりの意味ではありません。上限に合わせて文章を書く、変数名を付け替える、モックアップを埋めるといった日常の作業の裏には、知っておく価値のあるいくつかの規則があります。この記事では、このサイトの小さなテキストツールを実例として使いながら、それらを順に見ていきます。

何を「単語」として数えるか

私たちのものも含めほとんどのカウンターは、タイピストと同じやり方で単語を定義します。つまりスペースや改行で区切られた、目に見える文字の連なりです。この単純な規則だけで、食い違いの多くは説明がつきます。英語の「state-of-the-art」は1語か4語か。空白区切りなら1語です。数字やURL、メールアドレスもそれぞれ1語として数えられます。この慣習は、スペースなしで書かれる言語では成り立ちません。日本語には区切りとなる空白がないため、「単語数」という概念自体に意味がなく、代わりに文字数を基準に考えるべきです。実際、当サイトの単語カウンターツールが日本語に対して主に文字数を返すのはそのためです。読了時間の推定にはさらに別の慣習が重なります。当サイトの単語カウンターは、黙読の平均的な速さとしてよく使われる1分間200語という数値で単語数を割っているので、結果は約束ではなく計画のための目安として扱ってください。

1つの文字が必ずしも1つの記号とは限らない

文字数のカウントはさらに複雑です。Unicodeのテキストには層があるからです。あなたが1つの文字(書記素)として認識するものが、実際には複数のコードポイントから構成されていることがあり、それぞれのコードポイントは、JavaScriptのlengthプロパティが数える16ビット単位を1つか2つ占めます。にっこり笑う顔の絵文字は1つの書記素ですが、その単位では2つ分になるため、単純なカウンターは2と答えます。複数の人物の絵文字を組み合わせた家族の絵文字は、書記素としては1つですが、コードポイントは5つ、単位は8つです。普通のテキストにも同じ問題があります。「café」のéは、1つのコードポイントとして格納されることもあれば、eと結合用アクセント記号の組み合わせとして格納されることもあり、画面上では同じに見えても数え方は異なります。2つのカウンターが食い違うのは、それぞれ違う層を測っているからです。コードポイントをユーザーが認識する1文字にまとめる規則はUnicodeのテキスト分割規格(UAX #29)として標準化されており、きちんと作られたカウンターはこれに従います。

3つの文字列を3つのUnicode層で測定:にっこり笑う顔の絵文字は1書記素・2UTF-16単位、家族の絵文字は1書記素・5コードポイント・8単位、分解されたcaféは4書記素だが5コードポイント

実際にカウントの対象となる上限

文字数の上限が絡むと、カウントはお金の問題になります。SMSはコンパクトなGSM-7アルファベットで160文字を運びますが、その範囲外の文字(絵文字や、そのアルファベットにない文字)が1つでも入るとメッセージ全体がUCS-2に切り替わり、上限は70文字に下がります。長いメッセージは153文字または67文字ずつのパートに分割され、それぞれ別々に課金されます。Xは1投稿あたり280文字までですが、文字ごとに重みを付けます。URLは実際の長さに関わらずすべて23文字として数えられ、多くの絵文字とCJK文字(中国語・日本語・韓国語の文字)は2文字として数えられます。検索結果のスニペットには、代わりにゆるやかな上限があります。Googleはタイトルと説明文をピクセル幅で切り詰めるため、おなじみの「タイトル60文字、説明文155文字」という数字は保証ではなく目安の慣習にすぎません。上限が重要な場面では、そのプラットフォームが使っているのと同じ規則で数え、余裕を残しておきましょう。

大文字小文字は慣習であり、各スタイルには居場所がある

大文字小文字の変換は些細なことのように思えますが、その上に積み重なった慣習に出会うと話は変わってきます。これはラテン文字のテキスト、たとえばコードの識別子や英語のタイトルに関わる区別です。米国の見出しで好まれるTitle Case(各単語の頭文字を大文字にする)と、多くのヨーロッパのスタイルガイドが好むsentence case(文の先頭だけを大文字にする)があります。コードにも独自の系統があります。JavaScriptやJavaの変数名にはcamelCase、クラスやコンポーネント名にはPascalCase、Pythonやデータベースにはsnake_case、定数にはSCREAMING_SNAKE_CASE、CSSのクラス名やファイル名、URLスラッグにはkebab-caseが使われ、小文字にすることで大文字小文字だけが違うリンクという古典的な罠を避けられます。識別子を数個手作業で変換するのは問題ありませんが、80個のリストを変換するとなるとタイプミスの温床になります。ケース変換ツールはこの変換を機械的に適用し、頭字語や既存の区切り文字をどう扱うかといった細かい部分も処理します。

「user profile page」というフレーズを6つのケーススタイルで表記:camelCase、PascalCase、snake_case、SCREAMING_SNAKE_CASE、kebab-case、Title Case

ダミーテキストと、スマートフォンが開いてくれないファイル

残る2つの作業でこの一覧を締めくくります。レイアウトはプレースホルダーテキストで確認されます。本物の文章だとその意味に注意が引かれてしまうからです。lorem ipsumがうまく機能するのは、ほぼ読めそうでいて実際には読めないラテン語だからです。当サイトのジェネレーターは段落・文・単語の単位で生成できるので、同じ1つの文章を貼り付けて繰り返すのではなく、現実的な長さでモックアップを埋められます。そして誰かが送ってきた.md、.json、.csv、.logファイルをスマートフォンが開いてくれないとき、ブラウザ上のテキストビューアなら、エディタをインストールしたり、どこかの変換サイトにファイルを転送したりせずに中身を表示できます。カウントも含め、これらはすべてブラウザの中だけで完結します。テキストは一切あなたの端末を離れません。測ろうとしているものが下書きや契約書、内部パスだらけのログである場合、これはいつも以上に重要です。

この記事で紹介するツール

よくある質問

1ページに単語はいくつ入りますか?

出版業界の慣習では、シングルスペースのページでおよそ500語、ダブルスペースのページでおよそ250語とされています。これはA4またはレターサイズの用紙に標準的な12ポイントのフォントを使うことを前提としています。実際の文書は、フォントや余白、見出しが変わるたびにこの数字からずれていきます。そのため、課題や提出物ではページ数ではなく単語数を指定することが増えています。テキストが手元にあるなら、目安に頼らず直接数えましょう。ページ数の慣習は、テキストがまだ存在しない段階でのみ役に立ちます。

lorem ipsumとは実際どういう意味ですか?

これはでたらめな文字列ではなく、切り貼りされたラテン語です。定番の文章は、紀元前45年の哲学書『De finibus bonorum et malorum』(善と悪の究極について)から切り出して並べ替えたもので、その断片「dolorem ipsum」は「痛みそのもの」を意味します。この並べ替えこそが要点で、単語の長さや文のリズムがもっともらしいため自然言語のように見えつつも、実際に読み進めることには抵抗があるため、見る人はコピーの内容ではなくレイアウトを判断できます。現代に広まったきっかけは、通常1960年代のレトラセット転写シートと1980年代のDTPソフトウェアによるものとされています。

なぜプラットフォームは自分のカウンターより少ない文字数を表示するのですか?

プラットフォームは独自の重み付けで数えているからです。Xは280文字を基準にしますが、すべてのURLを23文字として、ほとんどの絵文字とCJK文字を2文字として課金します。SMSゲートウェイは、1文字でもGSM-7アルファベットに収まらないものがあると、メッセージ全体を160文字のGSM-7から70文字のUCS-2モードに切り替えます。そしてどのプラットフォームでも、書記素ではなく符号単位で数えている場合があり、1つの家族の絵文字だけで上限のうち8文字分を消費することもあります。ボタンに表示される数字が自分のカウンターと食い違うときは、プラットフォームの規則が優先されます。送信する前に余裕を持って作成するか、プラットフォーム自体のカウンターで確認してください。

出典