Character and Word Counter
Count characters, words, sentences and reading time, with live limits for meta titles, descriptions and social posts. Counts graphemes, not UTF-16 units.
Counts
Reading time assumes silent reading at 200 words per minute.
A visible character is what a reader counts as one letter. An emoji family or a flag takes several units in the character count but is a single visible character.
Length budgets
Search engine numbers are truncation points rather than hard rules: a longer title is not rejected, it is cut with an ellipsis in the results page. The tweet limit is a real ceiling.
Key Takeaways
- Character count and byte length are different numbers: "ş" is one character but two bytes.
- JavaScript miscounts emoji. "👨👩👧".length returns 8, while the screen shows a single glyph.
- A VARCHAR(50) column usually means 50 bytes, not 50 characters, depending on the database.
- Search engines measure titles in pixels rather than characters, so the limits here are a safe approximation.
Why counting characters is harder than it looks
Counting what someone typed into a box looks like a job for text.length, and as long as the text is English, it is. The problem appears the moment a non-ASCII letter or an emoji enters: the same string now produces three different numbers, and which one is correct depends entirely on what you are going to do with it.
This tool reports all three. Deciding which to read starts with understanding where the difference comes from.
Characters, code units and graphemes
JavaScript stores strings as UTF-16 code units. length gives you the number of those units, not the number of characters. For Latin letters the two coincide, which is why the difference goes unnoticed for years:
'hello'.length // 5, as expected'ş'.length // 1, still fine '👋'.length // 2 <-- one glyph, two code units'👨👩👧'.length // 8 <-- one glyph, eight code units // To count what the screen shows, use Intl.Segmenterconst seg = new Intl.Segmenter('en', { granularity: 'grapheme' });[...seg.segment('👨👩👧')].length // 1The unit a reader sees is called a grapheme. When a user asks how many characters they typed, a grapheme count is almost always what they mean. This tool counts graphemes with Intl.Segmenter, falling back to code points where that API is unavailable.
When byte length is the number that matters
Character count governs the screen; byte length governs storage. Under UTF-8 an ASCII letter takes one byte, a Turkish or accented letter takes two, and most emoji take four. That difference surfaces at database boundaries:
| Text | Characters | Bytes |
|---|---|---|
| hello | 5 | 5 |
| Kürşad | 6 | 9 |
| İstanbul | 8 | 9 |
| 👋 | 1 | 4 |
Warning
VARCHAR(50) behaves according to the column character set, and the legacy utf8 set cannot store four-byte characters at all. A field that may contain emoji needs utf8mb4. PostgreSQL counts varchar(n) in characters, so it does not have this failure mode.SEO limits and the pixel-width problem
You will see numbers like 60 characters for a meta title and 155 to 160 for a description. They are useful, but what a search engine actually measures is pixel width. An "i" and an "M" do not occupy the same space, so of two 60-character titles one may fit and the other may be truncated.
The practical approach is to treat the counter as a warning rather than a rule. As you approach the limit, move the important words to the front so the meaning survives truncation.
Word counting and apostrophes
Splitting on whitespace looks sufficient until apostrophes appear. "don't" is one word, and so is the Turkish "Türkiye'nin", where the apostrophe attaches a suffix to a proper noun. A counter that splits on the apostrophe reports two words, and over a long document the error accumulates. This tool keeps apostrophes inside words while still handling them as quotation marks where that is what they are.
Reading time is derived from the word count at 200 words per minute. Technical prose with code blocks reads slower than that, so treat the figure as a lower bound.
Frequently Asked Questions
- Is the text I type sent anywhere?
- No. Counting happens entirely in JavaScript in your browser. Once the page has loaded you can disconnect from the network and the tool keeps working.
- Why does an emoji count as several characters?
- Because "character" describes two different things. JavaScript counts UTF-16 code units; you mean the glyph on screen. The tool shows both on separate rows: for the number of glyphs, read the grapheme figure.
- How long should my meta description be?
- Roughly 155 to 160 characters is safe on desktop, and mobile truncates earlier. Google frequently replaces the description with text of its own choosing, so it is not worth mangling a sentence to hit an exact number.
- Why do characters and bytes differ?
- UTF-8 does not store every character at the same size. ASCII letters take one byte, accented and Turkish letters take two, and emoji usually take four. If your limit is a database column, byte length is the number to check.
- How is reading time calculated?
- Word count divided by 200 words per minute. That is an average reading speed; technical text containing code will take longer.