All articles

Counting characters and words: why it's not always trivial

Counting characters and words sounds trivial until English's own punctuation gets in the way: contractions, hyphenated compounds, and possessives all blur what should count as "one word."

Contractions: one word or two?

"Don't," "it's," and "we'll" are each typed as a single unbroken token, so most word counters treat them as one word — even though "don't" means "do not" and arguably represents two grammatical words fused with an apostrophe. This is why a word count of a casual, contraction-heavy text and its fully expanded formal rewrite can differ noticeably even though they say the same thing.

Hyphenated compounds split the difference

English freely builds compound words with hyphens — "well-known," "twenty-one," "mother-in-law" — and whether a splitter treats the hyphen as a word boundary changes the count. Style guides themselves disagree on when a compound should be hyphenated, written as two words, or fused into one ("well known" vs. "well-known" vs., eventually, "wellknown"-style closed compounds like "email" once was "e-mail").

Why byte size matters for character limits

Plain English text is one of the few cases where character count and UTF-8 byte count line up almost exactly, since ASCII letters take one byte each. That changes the moment curly quotes, em dashes, or emoji sneak in from a word processor's autocorrect — each of those can cost two to four bytes, quietly pushing a text past a byte-based limit even though the character count looks fine.

Why you need this

  • Checking text against a character limit (a tweet, an SMS, a form field).
  • Estimating an article's reading time from its word count.
  • Diagnosing a mismatch between a text's "visible" length and what a character counter in code reports.

Counting words in languages without spaces

In Chinese, Japanese, or Thai, words are traditionally not separated by spaces — the boundary between words is defined by grammar and context, not a delimiter. So "word counting" for these languages actually requires a separate text segmentation algorithm, and simple space-based counting there either yields a single "word" for the whole text or loses its meaning entirely.

Try the tool