Count words, characters and reading time
Counts the words, characters, sentences and paragraphs in a piece of text, and turns the word count into a reading time. Word and character boundaries come from the browser's own Unicode segmenter rather than from a split on spaces, so Japanese, Chinese and Thai count correctly and an emoji counts as one character.
Most-used words
| the | 4 | 6.56% |
| over | 3 | 4.92% |
| to | 3 | 4.92% |
| a | 2 | 3.28% |
| is | 2 | 3.28% |
| it | 2 | 3.28% |
| this | 2 | 3.28% |
| your | 2 | 3.28% |
| alphabet | 1 | 1.64% |
| and | 1 | 1.64% |
How it works
What this counts
Words, characters with and without spaces, sentences, paragraphs, how many different words were used, the average sentence length, and how long the text takes to read silently and aloud. Below the figures is a table of the twenty-five most-used words, which downloads as a spreadsheet.
The interesting question is not what to count but where one word stops and the next begins. Splitting text on spaces is the obvious answer and it is wrong for a large part of the world: Japanese, Chinese, Thai, Lao, Khmer and Burmese are written without them, so a space-based counter reports a whole paragraph as one word and nobody notices until somebody who writes in one of those languages tries it.
The method
Every count comes from Intl.Segmenter, which is the browser’s own copy of the
Unicode segmentation algorithm described in UAX #29. It is not an
approximation of a text-analysis library — it is the reference implementation,
shipped with the browser, and for the scripts that need one it carries a
dictionary.
Words are the segments the algorithm marks as word-like, which excludes
spaces, punctuation and symbols but includes numbers. Characters are
grapheme clusters, so an accent written as a separate combining mark, or an
emoji carrying a skin-tone modifier, counts once rather than twice or four
times. That is a different number from the one JavaScript’s own length gives,
and it is the one a person would arrive at by counting.
Sentences need one addition to the standard rules. UAX #29 cannot tell that the full stop in “Dr. Smith” is part of a title rather than the end of a sentence — it sees a period, a space and a capital letter, which is the definition of a boundary. ICU solves this with a per-locale suppression list, but the browser API does not expose it, so a short list of twenty abbreviations plus any single initial is applied here instead. Abbreviations that really can end a sentence are left off it deliberately, because merging two real sentences is a worse error than splitting one.
Paragraphs are blocks with a blank line on either side. Single line breaks do not divide one, which matches how prose is written and how every other counter behaves.
Reading times are simple division, and the rates are editable because averages are only averages. Both defaults come from a 2019 meta-analysis of 190 studies: 238 words a minute reading English non-fiction silently, 183 reading aloud.
Before you read on
A thumbs-up emoji carrying a skin-tone modifier. How many characters does this tool count it as?
One. Characters here are grapheme clusters as defined by UAX #29 — so an accent written as a separate combining mark counts once rather than twice, and an emoji with a skin-tone modifier counts once rather than four times. That is a different number from the one JavaScript's own length property gives, and it is the one a person would arrive at by counting. Every figure on this page comes from Intl.Segmenter, which is not an approximation of the Unicode algorithm but the browser's own copy of it.
- Different words4980.3%
- Repeats1219.7%
A worked example
The text the page loads with is two paragraphs and 321 characters:
The quick brown fox jumps over the lazy dog. That one sentence contains
every letter of the alphabet, which is why typographers have used it for
well over a century to show a typeface at work.
Paste your own text over this. The counting happens in this browser tab,
on your machine, and there is no server to send it to.
At the default rates of 238 and 183 words a minute:
| Words | 61 |
| Characters | 321 |
| Characters without spaces | 260 |
| Sentences | 4 |
| Paragraphs | 2 |
| Different words | 49 |
| Average sentence length | 15.3 |
| Reading time | 15 seconds |
| Reading aloud | 20 seconds |
61 words at 238 a minute is 15.4 seconds, and at 183 a minute is 20.0. The average sentence length is 61 divided by 4. Forty-nine different words out of sixty-one means only twelve are repeats, and the table shows which:
| Word | Times used | Share |
|---|---|---|
| the | 4 | 6.56% |
| over | 3 | 4.92% |
| to | 3 | 4.92% |
| a | 2 | 3.28% |
| is | 2 | 3.28% |
These are the same numbers asserted in this tool’s test file, so if the counting ever changes without this page changing with it, the build fails.
What it does not do
It does not read a file, and it stops at 2,000 characters — about one side of A4 — because the text travels in the page link and a link has to survive being pasted somewhere. It does not know what a heading, a list item or a table cell is, so a pasted document with structure in it is counted as the plain text it becomes. It does not do readability grades: those formulas count syllables, and syllable counting is language-specific guesswork of a kind this deliberately avoids. And the reading times are arithmetic, not a prediction — they assume a reader who never pauses, which is not a reader.
It counts what is there and changes none of it. To alter the text itself — title case, sentence case, snake_case — that is a conversion rather than a count, and a different tool.
How it is done
- Fold Windows and classic Mac line endings to a single newline, so the same text pasted from any editor counts identically.
- Segment the text with Intl.Segmenter at word granularity and count the segments Unicode marks as word-like. Punctuation, spaces and symbols yield segments too, and none of them are words.
- Segment it again at grapheme granularity for the character count, so an accented letter written as two code points, or an emoji with a skin-tone modifier written as four, still counts as one character.
- Segment it a third time at sentence granularity, then join a segment onto the one after it when it ends in an initial or in one of twenty listed abbreviations. Without that step, "Dr. Smith went home." is two sentences.
- Split the text on blank lines for the paragraph count and discard any block that turns out to be only whitespace.
- Tally the word-like segments, lower-cased unless case sensitivity is switched on, and keep the twenty-five most frequent for the table.
- Divide the word count by each of the two rates and round to the nearest whole second.
What it assumes
- Word boundaries are the default Unicode rules from UAX
- Characters are grapheme clusters, which is the thing a person points at and calls a character. That is not the same as the length of the string in code units, and for emoji and combining accents it is the count people expect rather than the one a programming language reports.
- Sentence boundaries are the same Unicode rules with one addition. A segment ending in a single initial, or in one of Mr, Mrs, Ms, Mx, Dr, Prof, Rev, Sr, Jr, St, Mt, vs, fig, no, al, approx, dept, univ, vol or pp, is joined to the segment after it. That list is Latin-script and English-leaning, and it is the only part of the counting that is.
- Abbreviations that genuinely can end a sentence, such as "etc." and "Ltd.", are deliberately left off the list. Suppressing those would merge two real sentences more often than it would repair a false split.
- A paragraph is a block with a blank line on either side of it. Text broken with single line breaks and no blank lines is one paragraph, however many lines it occupies.
- Reading times are the word count divided by a rate, and nothing else. They take no account of unfamiliar vocabulary, tables, equations, or the reader stopping to think, all of which matter more than length.
- The default rates of 238 and 183 words a minute are meta-analytic averages for adults reading English. They are too fast for children, for readers working in a second language, and for dense technical prose, which is why both are editable.
Common questions
Is the text I am counting uploaded anywhere?
No. The counting runs in this browser tab, on your machine, and there is no server to send it to. The page keeps the text in the link's fragment so that a result can be shared, and a fragment is the one part of a URL a browser never transmits.
Why can I only count 2,000 characters at a time?
Because the whole state of the tool travels in the page link, and a link has to survive being pasted into a message. Two thousand characters is roughly one side of A4, or about 330 words of English. Longer documents need a tool that reads a file rather than a text box.
How does it count Japanese when there are no spaces?
The browser ships ICU's implementation of the Unicode segmentation rules, and for Chinese, Japanese, Thai, Lao, Khmer and Burmese those rules are dictionary-driven rather than space-driven. Splitting on whitespace would report a whole Japanese paragraph as one word; this reports six words for the seventeen characters of こんにちは世界。これはテストです。
Why is state-of-the-art counted as four words?
Because a hyphen is a word boundary in UAX #29 and an apostrophe is not. That is the standard behaviour rather than a choice made here, and it is the same rule that lets "don't" count as one word. Word processors differ on this, so a hyphen-heavy text will read a few words shorter in Word.
Why do I get one more sentence than I counted by hand?
Almost always an abbreviation that is not on the list. Twenty abbreviations and any single initial are stitched back onto the following sentence, but something like "The Acme Corp. was founded in 1970." will still be split in two, because "Corp." is not among them. The full list is in the assumptions above.
Which reading speed should I use?
238 words a minute is the meta-analytic average for adults reading English non-fiction silently, and 183 is the average for reading aloud. Both come from Brysbaert's 2019 review of 190 studies. For a talk, set the reading-aloud rate lower — 130 to 150 is a more usual pace in front of an audience.
Sources
Method written and checked by Tessalor on Jul 30, 2026.