Word & Character Counter

Count words, characters, sentences, and paragraphs

What Is a Word Counter?

A word counter measures the length of a piece of text: how many words, characters, sentences, paragraphs, and lines it contains. This one also estimates how long the text takes to read and to say out loud, and it lists the words you repeat most. The numbers update on every keystroke, so you can trim a draft and watch them fall as you edit. All of the counting runs in JavaScript in your browser, and the text you paste is never uploaded.

Developers need one more often than you’d expect: checking a meta description before a deploy, keeping a commit subject under 50 characters, fitting App Store copy into a 30-character field, or sizing a conference talk before building the slides.

How to Use the Word Counter

  1. Paste or type your text into the input box. There’s no button to press, because every statistic updates as you type.
  2. Read the results in the output panel: characters (with and without spaces), words, sentences, paragraphs, lines, reading time, speaking time, and your top 10 keywords.
  3. Copy the report with the Copy button or Ctrl+Shift+C. It’s plain text, so it pastes cleanly into a ticket or a chat.
  4. Clear the input with the Clear button or Ctrl+L.

Your last input is saved in your browser’s local storage, so it’s still there if you close the tab by accident.

How Each Count Is Calculated

Word counters disagree with each other mostly because they define “word” and “sentence” differently. These are the exact rules this tool follows:

StatisticRuleExample
WordsAny run of characters between spaces, tabs, or line breaksstate-of-the-art = 1, don't = 1, 3.14 = 1, Tom & Jerry = 3
CharactersEvery character, including spaces and line breaksHi there = 8
Characters (no spaces)The same, minus spaces, tabs, and line breaksHi there = 7
SentencesText ending in ., !, or ? (closing quotes and brackets allowed) followed by a space or the end of the text; an unpunctuated last sentence also countsDone. Ship it = 2
ParagraphsBlocks of text separated by at least one blank lineTwo lines with no blank line between them = 1
LinesNumber of line breaks + 1A five-item list, one item per line = 5
Reading timeWords ÷ 200 per minute1,000 words ≈ 5 min
Speaking timeWords ÷ 130 per minute650 words ≈ 5 min
Top keywordsWords of 3+ letters, case-insensitive, as a share of all wordsthe: 12 (4.8%)

Why Your Count Differs From Other Tools

Two word counters rarely agree to the last word. When they don’t, the difference almost always comes from one of these:

  • Dashes and slashes. and/or, e-mail, and word—word (an em dash with no spaces around it) count as one word here, because there’s no whitespace inside them. Some editors split on dashes and slashes, which adds a word for each.
  • Standalone symbols. An &, a dash surrounded by spaces, a bullet •, or a Markdown marker like ## or - is a whitespace-separated token, so it counts as a word. If you need a count of the prose alone, paste the rendered text rather than the Markdown or HTML source.
  • Abbreviations. Dr. Smith and e.g. this each add an extra sentence, because a period followed by a space looks exactly like the end of a sentence. Decimals such as 3.14 are safe, since no space follows the period.
  • Hidden characters. A zero-width space (U+200B), which sometimes comes along when you copy from web pages and chat apps, is invisible but isn’t whitespace. Two words joined by one count as a single word, and it adds a character to both character counts. Non-breaking spaces (U+00A0) are treated as normal spaces.
  • Languages without spaces. Chinese, Japanese, and Thai don’t put spaces between words, so a whole sentence counts as one “word”. Use the character count instead, which is how length is measured in those languages anyway.

Characters, Emoji, and Unicode

The character count is the length of the text as JavaScript measures it (text.length), in UTF-16 code units. For most text that equals the number of characters you see: Latin letters, accented letters such as é, Cyrillic, Greek, and common Chinese characters count as 1 each. The exceptions are:

TextCounted asWhy
😀2Emoji sit outside the Basic Multilingual Plane, so each takes a surrogate pair
👍🏽4Thumbs-up (2) + skin-tone modifier (2)
🇺🇸4A flag is two regional-indicator letters, 2 each
👨‍👩‍👧8Three people (2 each) joined by two zero-width joiners (1 each)
é stored as e + accent2A decomposed accent: the base letter plus a combining mark, as in some PDFs and older macOS file names

Counting this way is deliberate. It’s the number .length returns, so it matches what a web form’s client-side validation and most JavaScript code will see. Other systems count differently:

  • X (Twitter) gives every emoji a weight of 2 no matter how many code points it contains, and counts Chinese, Japanese, and Korean characters as 2 as well. The 280 limit for standard accounts applies to that weighted total.
  • SMS uses the 7-bit GSM alphabet when it can: 160 characters per message, or 153 per segment once a message is split. A single emoji or curly quote (’) switches the whole message to UCS-2, which drops the limit to 70 (67 per segment), and each emoji then takes 2 of those slots.
  • Python’s len() counts code points, so len("👍🏽") is 2, not 4.
  • Databases usually limit text columns in characters, meaning code points: VARCHAR(255) in PostgreSQL, or in MySQL with utf8mb4. Byte limits are a separate question. In UTF-8 an emoji takes 4 bytes.

Reading Time and Speaking Time

Reading time divides the word count by 200 words per minute. That’s deliberately conservative. A 2019 meta-analysis by Marc Brysbaert put average adult silent reading at about 238 words per minute for non-fiction and 260 for fiction, and Medium bases its read-time label on roughly 265. Technical documentation, text full of code samples, and anything read in a second language all go slower, so 200 is the safer figure for developer content. Expect our estimate for a blog post to run about a third longer than Medium’s.

Speaking time divides by 130 words per minute, a measured presentation pace that leaves room for pauses and slide changes. Conversational speech and podcasts often run at 150–160 words per minute, and nervous speakers go faster than they planned. Use these figures when you plan a talk:

Talk lengthWords at 130 wpmWords at 160 wpm
1 minute130160
5-minute lightning talk650800
10 minutes1,3001,600
20-minute conference slot2,6003,200
30 minutes3,9004,800

Leave part of a conference slot for questions, and budget extra for live demos, which almost always take longer than their script.

Common Length Limits

WhereLimitCounted as
X (Twitter) post280Weighted characters (emoji and CJK = 2)
SMS message160 / 70Characters (GSM-7 / UCS-2)
Google title link~50–60Characters, approximate (truncated by pixel width)
Meta description~150–160Characters, approximate (truncated by pixel width)
Git commit subject50Characters, by convention (wrap the body at 72)
App Store app name / subtitle30 / 30Characters
Google Play title / short description30 / 80Characters
Stack Overflow question title150Characters
YouTube title / description100 / 5,000Characters
LinkedIn post3,000Characters
Instagram caption2,200Characters
Common App personal essay650Words

Platforms change their limits from time to time, so check the platform’s own documentation before you rely on an exact number.

Keyword Density

The Top Keywords list shows the 10 words you use most, each as a percentage of the total word count. It’s case-insensitive, works in any alphabet, ignores punctuation, and skips words shorter than three letters. It doesn’t filter out common words, so “the”, “and”, and “for” usually top the list in English prose. Look past them.

The list is most useful for catching repetition. If one word makes up 3–4% of a short paragraph, readers will notice it before you do. It isn’t an SEO target. Search engines don’t reward any particular keyword density, and repeating a phrase to hit a number is keyword stuffing, which Google’s spam policies explicitly name.

Words vs. Tokens

AI models set their context limits and prices in tokens, not words. In English one word averages about 1.3 tokens, so 1,000 words is roughly 1,300 tokens. Source code, JSON, and most non-English languages use noticeably more tokens per word. When you need the exact number for a prompt or a context window, paste the same text into the AI Token Counter.

Counting Words in Code

When you need the same counts in a script or a CI check, these one-liners split words on whitespace just like this tool:

EnvironmentWordsCharactersLines
Shellwc -w file.txtwc -m file.txtwc -l file.txt
JavaScripts.trim().split(/\s+/).filter(Boolean).lengths.length (UTF-16 units)s.split('\n').length
Pythonlen(s.split())len(s) (code points)len(s.splitlines())

A few gotchas:

  • wc -l counts newline characters, so a file without a final newline reports one line fewer than your editor shows. wc -c counts bytes, not characters. Use wc -m for characters in a UTF-8 locale.
  • In JavaScript, "".split(/\s+/) returns [""], a one-item array. Trim and filter out empty strings, or an empty input reports 1 word.
  • For languages without spaces, JavaScript’s Intl.Segmenter does real word segmentation: [...new Intl.Segmenter('ja', { granularity: 'word' }).segment(s)].filter(x => x.isWordLike).length. With granularity: 'grapheme' it counts user-perceived characters instead, so 👍🏽 is 1.

Your Text Stays in Your Browser

Drafts, cover letters, and unreleased docs are exactly the kind of text you shouldn’t paste into a random website. This counter runs entirely in your browser, and nothing you type is sent to a server. Your last input is kept in local storage on this device only, and Clear deletes it.

To keep working with the same text, change its capitalization with the Case Converter, strip repeated lines with Remove Duplicate Lines, compare two drafts in the Diff Checker, or generate filler of a set length with the Lorem Ipsum Generator.

Frequently Asked Questions

How are words counted?

A word is any run of characters between spaces, tabs, or line breaks. Hyphenated words (state-of-the-art), contractions (don't), numbers, and URLs each count as one word. A standalone symbol such as & or a Markdown ## heading marker also counts as a word, because spaces separate it from its neighbors.

Does the character count include spaces?

Both numbers are shown. Characters counts everything, including spaces, tabs, and line breaks. Characters (no spaces) removes all whitespace. Most platform limits, such as the 280 on X and the 160 for an SMS, include spaces, so use the first number for those.

Why does one emoji count as 2 or more characters?

The character count is JavaScript's string length, which measures UTF-16 code units. An emoji sits outside the Basic Multilingual Plane and takes two code units, and combined emoji take more: a thumbs-up with a skin tone is 4, and a family emoji is 8. That's the same number a web form's JavaScript validation sees. X, by contrast, counts every emoji as 2.

How is reading time calculated?

The word count is divided by 200 words per minute, a conservative average that suits technical writing. Speaking time uses 130 words per minute, a steady presentation pace. Anything under a minute is shown in seconds.

How many words is a 5-minute speech?

About 650 words at a measured 130 words per minute, or up to 800 at a conversational 160. A 10-minute talk is roughly 1,300 to 1,600 words. Read your draft aloud against a timer once, because individual pace varies more than the averages suggest.

Why doesn't my count match Microsoft Word or Google Docs?

Word processors handle dashes, slashes, and standalone symbols a little differently, and depending on settings they may include or skip footnotes, headers, and text boxes. This tool counts every whitespace-separated token in exactly the text you paste. On normal prose the counts land within a few words of each other. Bigger gaps usually come from Markdown symbols, bullet characters, or hidden zero-width spaces.

Is my text saved?

Your text is saved only in your browser's local storage, so it survives a page reload. It's never sent to a server. Click Clear or press Ctrl+L to remove it.