You paste a draft into one tool and it says 1,204 words. Your editor says 1,198. A colleague runs wc -w and gets 1,211. Nobody made a mistake: each tool is answering a slightly different question, and none of them tells you which one.
The fix is knowing what each count actually measures. If you just want the numbers, the Skojio word counter shows words, characters, lines and bytes side by side, and explains which is which.
- A "word" is a definition, not a fact: hyphens, dashes, emoji and CJK text are where tools disagree.
-
wc -lcounts newline characters, so it is often one off from the line numbers your editor shows. - One emoji can be 1 character, 2 code points, 4 UTF-16 units or 8 bytes, depending on who is counting.
- Count graphemes for human limits (titles, posts, essays) and bytes for storage limits.
- A browser-based counter is fine for private text, as long as the counting really happens in your browser.
How word counters decide what counts as a word
Every word counter starts by splitting on whitespace. The differences are in what happens to the pieces.
-
Punctuation on its own. In
wait — what?the em dash sits between spaces. A plaintext.split(/\s+/)counts it as a word, giving 3. Most editors count 2. -
Hyphens and contractions.
well-knownanddon'tare one word almost everywhere, but a counter built on a regex like\w+turns them into two. -
Emoji. A thumbs-up between spaces is a "word" to a naive split, and nothing to a word processor. Even
wc -wdiffers here: BSDwcon a Mac counts it, recent GNUwcdoesn't. -
Numbers.
3.14and2026-11-05are one word each in most tools, several in regex-based ones.
The sensible rule, and the one most editors follow, is that a word is a whitespace-separated chunk containing at least one letter or digit. That keeps well-known whole and drops a stray dash. The word, line and character counter uses exactly that rule, so its figure lines up with what a writing tool reports.
If a client or a submission portal sets a word limit, ask which tool they measure with. A 2% gap between tools is normal, and it is the margin that gets essays bounced.
Word count for Chinese and Japanese text
Splitting on spaces fails completely for languages written without them. Paste a paragraph of Chinese or Japanese into a whitespace-based counter and it reports one word, however long the paragraph is.
Modern browsers ship a fix: Intl.Segmenter with word granularity finds word boundaries using the same dictionary data the operating system uses for line breaking and double-click selection. It is not perfect (word boundaries in Chinese are genuinely ambiguous), but it is far closer than "1". Thai, Lao, Khmer and Burmese have the same problem and the same solution.
Count lines in text: why wc -l is off by one
wc -l does not count lines. It counts newline characters.
For a file that ends with a newline, which is what POSIX expects and what most editors write, the newline count equals the number of lines. For a file without a trailing newline, wc -l reports one fewer than you can see. Editors go the other way: after a trailing newline, many show an empty final line, so the gutter reads one higher than wc.
Line endings add another trap. A file saved on Windows uses \r\n, and a very old Mac file uses a bare \r. wc -l only looks for \n, so a classic-Mac file reports zero lines. A line counter worth using treats all three endings as line breaks and shows you both numbers: lines as an editor numbers them, and the raw newline count. For logs and CSVs it also helps to see blank lines and the longest line, since those are usually what you were really checking.
Character count with emoji: four different answers
Characters are where counts drift furthest apart, because "character" has at least four meanings.
-
Graphemes are what a reader perceives as one character. A flag, an emoji with a skin tone, or
ébuilt fromeplus a combining accent are each one grapheme. -
Code points are Unicode's units. That waving hand is two: the hand and the skin-tone modifier.
wc -mcounts these. -
UTF-16 units are what JavaScript's
.lengthreturns. Anything outside the basic plane takes two, so one emoji is four. Plenty of web counters andmaxlengthattributes measure this. - UTF-8 bytes are what disk, network and many database columns measure. The same emoji is eight.
For anything a person reads, count graphemes. For anything a machine stores, count bytes.
SEO titles, meta descriptions, SMS bodies and social posts are read by people, so graphemes are the honest unit (even if a particular platform applies its own weighting on top). A VARCHAR(255) column in a UTF-8 database is a byte budget, and a string that fits in 255 characters can still overflow it.
A safer way to count words, lines and characters
Two things make a counter trustworthy: it shows its definitions, and it never needs your text to leave your machine. Drafts, contracts and logs are exactly the things you shouldn't paste into a site that posts them to a server.
The Skojio counter runs entirely in your browser. It counts graphemes for characters (with UTF-8 bytes alongside), segments CJK text into real words, shows lines, blank lines, the longest line and the wc -l figure, and gives reading and speaking time. Select part of the text to count just that section, or set a 60 or 160 character target to fit a title or meta description.
Word count is not token count. If you're sizing a prompt for an AI model, a 1,000 word draft can be anywhere from about 1,300 to 2,000 tokens. Use an LLM token counter for that budget instead.
Recap
| Question | Unit to use | Watch out for |
|---|---|---|
| Essay or article length | Words (letter or digit required) | Dashes and emoji counted as words |
| Lines in a log or CSV | Lines, plus newline count |
wc -l misses a final unterminated line |
| Title, post or SMS length | Graphemes |
.length counts emoji as 2 or more |
| Database or API field | UTF-8 bytes | Non-ASCII text uses 2 to 4 bytes per character |
| Chinese or Japanese text | Segmented words | Whitespace splitting reports 1 word |
When the numbers disagree, check the unit before you check the text, then confirm it in the in-browser word and line counter.
Top comments (0)