文章を貼ると、打つたびに数え直す
- 上の欄に文章を貼る。テキストファイル(.txt)やMarkdown(.md)は、欄に落とすか「ファイルを開く」で読める。UTF-8で読めなければShift_JISとして読む。
- 右に、空白と改行を含む字数と除いた字数が大きく出る。ほかの数も打つたびに数え直す。
- 応募フォームやXの投稿のように上限がある文章は、「上限までの残り」で種類を選ぶ。上限は自分で入れてもよく、空白や改行を含めて比べるかも選べる。超えると数字が赤くなる。
- 同じ言い回しの使いすぎを見たいときは、「語の出現回数」に語を入れる。出てくる行も出る。
- 文章はこの端末のブラウザに残るので、閉じても続きから数えられる。「消す」で欄と残した分が消え、押し間違えたら「元に戻す」で戻る。
絵文字は1字、CRLFの改行も1つ、全角空白は空白として数える
数える前に、文章を2つ整える。1つ目は改行で、CRLFもCRも1つの改行(LF)にそろえる。貼り付けた元で改行が2字になるのを避けるためだ。2つ目はUnicodeの正規化(NFC)で、「か」と濁点の記号(U+3099)が分かれて入った文字を「が」の1字に合成する。PDFから写した文字に分かれた濁点が混ざることがあり、そのまま数えると見た目より字数が増える。合成した字数は「細かい数」に出る。
1字の単位はコードポイントで、JavaScriptのArray.fromで分けた数を使う。lengthで数えると、😀や𠮷のようなサロゲートペアの文字が2字になってしまうからだ。そのかわり、肌の色を変えた絵文字や、ゼロ幅接合子でつないだ家族の絵文字は、部品の数だけ数える。見た目の1つを1字にする数え方もあるが、応募フォームがどちらで数えるかを確かめられなかったので、決まりがはっきりしたほうにした。
空白として扱うのは、半角空白、全角空白、タブ、ノーブレークスペース(U+00A0)の4種類に垂直タブと改ページを足したもの。「空白・改行を除く」はこれと改行を引いた数になる。全角空白は空白の1字であり、同時に全角の1字でもあるので、全角の数とShift_JISのバイト数には入る。半角は、ASCIIの範囲(U+0000〜U+007F)と半角カナ(U+FF61〜U+FF9F)とし、ほかは全部全角と数える。半角カナの濁点は別の字なので、「ガ」は2字になる。
行数は改行の数に1を足した数で、最後に改行があると空の1行が増える。段落は、空白しかない行で区切った文の塊の数だ。英単語は半角の英字と数字の並びで、「don't」や「e-mail」のようにアポストロフィやハイフンでつながったものは1語にした。
原稿用紙は400字詰め(20字×20行)で2通り出す。「改行で改める」は、改行のたびに次の行へ移り、1行の字数を20で割って切り上げた行数を足して、20行で1枚とする。句読点を行の頭に置かない決まり(禁則)や、段落の頭の1字下げは数えに入れていない。「字数÷400」は改行を除いた字数を400で割って切り上げる。応募書類で「400字詰め2枚以内」と言われたら、厳しいほうの「改行で改める」で見ておく。
バイト数のUTF-8は、ブラウザのTextEncoderで変換した長さだ。改行はLFの1バイトで数える。Shift_JISはTextEncoderが対応しておらず、変換表もページに持たせていないので、半角を1バイト、全角を2バイトとした近似になる。😀のようにShift_JISに無い文字も2バイトで数えるので、U+FFFFを超える文字の数を別に出した。これ以外にもShift_JISに無い漢字はあり、そこは見分けていない。
Xの重みづけは、Xの開発者向けの資料に沿い、正規化したうえで漢字やかなを2、英数字と基本的な記号を1、URLを23、絵文字を2と数え、280までとする。1になる範囲を資料はtwitter-textの設定に任せていて、U+0000〜U+10FFと一般句読点の一部にしたのは私の記憶によるもので、確かめていない。URLは「http://」か「https://」で始まるものだけを拾う。正確な数は投稿画面で確かめてほしい。
確かめた資料は次のとおり。どれも2026年10月19日に確認した。
- Unicode Standard Annex #15「Unicode Normalization Forms」(NFCは正準分解のあとに正準合成をする)
- WHATWG「Encoding Standard」(TextEncoderはUTF-8だけ、TextDecoderはShift_JISを読める)
- X Developer Platform「Counting characters」(280までの重みづけ、URLは23、絵文字は2、NFCで正規化)
- Google検索セントラル「検索結果のスニペットを管理する」(メタディスクリプションの長さに上限はない)
メタディスクリプションの120字と志望動機の300字は、決まった上限ではない。検索結果で切られにくい長さと、応募フォームでよく見る上限を目安に置いた。
数える処理はJavaScriptとPythonで別々に書いた。かな、漢字、絵文字、分かれた濁点、半角カナ、全角空白、CRLFとCRの改行を混ぜたランダムな文章6,000件で画面に出る数を全部突き合わせ、語の出現回数も6,000件照合して、不一致は0件だった。Python側は字数をlen、正規化をunicodedata.normalize、UTF-8をencodeで数えた。
数えていて引っかかりそうなところ
Wordで数えた文字数と合わないのはなぜか
改行と空白の扱いが違うことが多い。このツールは改行を1字と数えた数、改行だけを除いた数、空白と改行を除いた数の3つを出す。Wordの数と合う行を探すと、どちらの数え方かが分かる。
絵文字は何文字と数えるのか
1つのコードポイントを1字と数えるので、😀は1字。肌の色を変えた絵文字や家族の絵文字は部品の数だけ数え、家族の絵文字1つが5字や7字になる。
Xに投稿できる長さはどう数えるか
上限の種類でXを選ぶと、上で書いた重みづけで数える。漢字やかなは2、英数字は1、URLは長さに関係なく23、絵文字は2で、合計280までになる。全角だけの文章なら140字が上限だ。
志望動機の300字は空白や改行を含むのか
決まった数え方はない。募集要項や応募フォームに指示があればそれに従う。指示がなければ、空白と改行を含む数で300字に収めておけば、どちらで数えられても超えない。
貼り付けた文章はどこかに送られるか
送られない。数える処理はページの中で動き、文章はサーバーに届かない。続きから使えるように、この端末のブラウザに文章が残る。「消す」を押すと残した分も消える。URLにも文章は載せていない。
文字数を数えたあとの作業
長い資料をAIに読ませる前に、章ごとの字数を数えて分け方を決める手順は長い資料をAIに読ませる型の記事に書いた。
AIが書いた文書の全角の数字が式で拾えないときは、AIの文書を照合する記事のASCの使い方で直せる。社外メールの下書きに半角カナや社内の語が残っていないかを機械で見るなら、メールの下書きを見る記事のスクリプトが使える。