Menu

Search toolsChangelog

to move to openDescribe the problem, not the tool

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.

Up to 2,000 characters, because the whole state of the tool travels in the page link.

238 words a minute is the meta-analytic average for adults reading English non-fiction.

Words
61
Word boundaries follow the Unicode rules in UAX #29, so text without spaces still counts correctly.
Characters
321
Characters without spaces
260
Sentences
4
Paragraphs
2
Different words
49
Average sentence length
15.3
Reading time in seconds
15
Reading aloud in seconds
20

Most-used words

the46.56%
over34.92%
to34.92%
a23.28%
is23.28%
it23.28%
this23.28%
your23.28%
alphabet11.64%
and11.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?

  • It is, and it is why so many counters disagree with the person using them. Four is the number of UTF-16 code units.

  • Yes. One grapheme cluster, which is one thing a reader would point at.

  • Two code points, but a modifier is not something anybody would count separately.

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.

The 61 words of the sample text. Only twelve of them are repeats, and the table below shows the five commonest words in the text.
  • Different words49
  • Repeats12

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:

Words61
Characters321
Characters without spaces260
Sentences4
Paragraphs2
Different words49
Average sentence length15.3
Reading time15 seconds
Reading aloud20 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:

WordTimes usedShare
the46.56%
over34.92%
to34.92%
a23.28%
is23.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

  1. Fold Windows and classic Mac line endings to a single newline, so the same text pasted from any editor counts identically.
  2. 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.
  3. 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.
  4. 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.
  5. Split the text on blank lines for the paragraph count and discard any block that turns out to be only whitespace.
  6. Tally the word-like segments, lower-cased unless case sensitivity is switched on, and keep the twenty-five most frequent for the table.
  7. 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.