# Word and Character Counter

> 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.

Use it: https://tessalor.com/en/documents/word-counter

This tool runs entirely in the browser. Nothing entered into it is uploaded.

## 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.

## Assumptions

- 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.

## Inputs

| Name | Label | Type | Default | Range |
| --- | --- | --- | --- | --- |
| `text` | Your text | textarea | 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. |  |
| `readingSpeed` | Silent reading speed | integer | 238 | 50 to 1000 |
| `speakingSpeed` | Reading-aloud speed | integer | 183 | 50 to 500 |
| `caseSensitive` | Treat The and the as different words | toggle | false |  |

## Outputs

- `words` — Words (integer), primary
- `characters` — Characters (integer)
- `charactersNoSpaces` — Characters without spaces (integer)
- `sentences` — Sentences (integer)
- `paragraphs` — Paragraphs (integer)
- `uniqueWords` — Different words (integer)
- `averageSentenceLength` — Average sentence length (number)
- `readingSeconds` — Reading time in seconds (integer)
- `speakingSeconds` — Reading aloud in seconds (integer)

## 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

- [Unicode Standard Annex #29: Unicode Text Segmentation](https://www.unicode.org/reports/tr29/) — Unicode Consortium, applies to Unicode 17.0.0. Retrieved 2026-07-30.
- [ECMAScript Internationalization API Specification (ECMA-402), Segmenter objects](https://tc39.es/ecma402/#sec-intl-segmenter-objects) — Ecma International, applies to 2026. Retrieved 2026-07-30.
- [How many words do we read per minute? A review and meta-analysis of reading rate](https://biblio.ugent.be/publication/8647789) — Marc Brysbaert, Journal of Memory and Language, volume 109, applies to 2019. Retrieved 2026-07-30.

---

Estimate, not advice. See https://tessalor.com/en/disclaimer.
Machine-readable catalogue: https://tessalor.com/api/tools.json
