How We Count

“How many characters is this?” has more than one correct answer. This page states exactly which answer each number on this site gives, how it is worked out, and where it is only an estimate.

Two things are true of everything below. First, the numbers in the tables are produced by the site’s own counting code when the page is built, so they are what the tools actually report. Second, the same values are fixed in the project’s automated tests, so a change to the code that altered a result would be caught.

What “character” means

The Unicode Standard itself notes that “character” is used in several senses. In practice a piece of text has four different lengths, and software picks whichever is convenient:

  • Visible characters (grapheme clusters): what a reader would point to and call one character.
  • Code points: the numbered entries in Unicode that the text is built from.
  • UTF-16 code units: the 16-bit pieces many programming languages and form fields count.
  • UTF-8 bytes: the size of the text in storage or in transit.

For plain unaccented English all four are equal, which is why the difference goes unnoticed until an emoji or an accent appears.

Tested examples measured in four units
ExampleTextCharactersCode pointsUTF-16 unitsUTF-8 bytes
Plain ASCIIUnaccented English text is the one case where every unit gives the same number.Hello, world!13131313
Accented letter (single code point)The é is one code point, U+00E9, but takes two bytes in UTF-8.café4445
Combining accentLooks identical to the row above, but the é is stored as e followed by a combining acute accent. A reader still sees four characters.café (e + U+0301)4556
Simple emojiOne code point outside the Basic Multilingual Plane: two UTF-16 units, four bytes.🙂1124
Emoji + skin toneA thumbs-up followed by a skin-tone modifier. Two code points drawn as one picture.👍🏽1248
Family emojiFour people joined by three invisible zero-width joiners: seven code points, one visible character.👨‍👩‍👧‍👦171125
FlagTwo regional-indicator letters (P and K) that display as a single flag.🇵🇰1248
Windows line break (CRLF)A carriage return plus line feed is one line break and one visible character, but two code points and two bytes. Browsers convert it to a single LF when you paste into a text box.Line one⏎Line two (CR + LF)17181818

Characters

The main Characters figure counts visible characters. Technically these are extended grapheme clusters as defined in Unicode Standard Annex #29, found with the browser’s built-in Intl.Segmenter. A letter with its accents, an emoji with a skin tone, a flag, and an emoji sequence joined by zero-width joiners each count as one.

Everything you can type counts: letters, digits, punctuation, symbols, spaces, tabs and line breaks. A line break is one character, including a Windows line break that is stored as two.

Because the rules come from the browser, the result follows the version of Unicode your browser implements. A newly introduced emoji sequence can count as more than one character in an older browser that does not yet know it.

If a browser has no Intl.Segmenter, the counter says so on the page and falls back to an approximation that handles combining accents, skin tones, joined emoji, flags and keycaps, but not every script. All current major browsers support it.

Characters without spaces

Characters without spaces is the Characters figure minus every visible character that is whitespace. “Whitespace” means the characters Unicode gives the White_Space property: the ordinary space, tab, line breaks, the non-breaking space, and the various fixed-width spaces used in typography.

Two consequences are worth knowing. Line breaks and tabs are excluded as well as spaces, so this number can be lower than one produced by simply deleting spaces. And zero-width characters, such as the zero-width space, are not whitespace in Unicode: they are invisible, but they are still counted. They appear under “Other” in Advanced statistics.

The Advanced panel shows Spaces (the ordinary space only), Line breaks and Whitespace characters (all of them) separately, so you can derive any variant a brief asks for.

Code points, UTF-16 units and UTF-8 bytes

  • Unicode code points are counted by walking the text one code point at a time. A stray half of a surrogate pair, which can occur in damaged text, counts as one.
  • UTF-16 code units is the text’s length as JavaScript reports it. The HTML maxlength attribute counts in this unit, so it is the one to check when a web form rejects text that looks short enough.
  • UTF-8 bytes is the encoded size: 1 byte for ASCII, 2 for most accented Latin, Greek, Cyrillic, Hebrew and Arabic letters, 3 for most other characters including Chinese, Japanese and Korean, and 4 for most emoji.

One practical point about line breaks: a browser text box always holds a line break as a single line feed, whatever was pasted in. Text saved on Windows, or submitted through a web form, may use two bytes per line break. If you are matching a byte or code-unit limit exactly, allow one extra per line break.

Words

Words are found with Intl.Segmenter in word mode, which applies Unicode’s word boundary rules, rather than by splitting on spaces. Every segment the browser marks as word-like is a word. One adjustment is made so the count matches how people and word processors count: word-like segments joined by a single hyphen, with no space on either side, are counted as one word.

Word counting examples
TextWordsWhy
don't stop2A contraction is one word.
well-known fact2Words joined by a single hyphen count as one.
state-of-the-art1However many hyphens join it.
one — two2A dash is punctuation, not a joiner.
3.14 and 1,0003A number with separators is one word.
hi 🙂 there2Emoji are not words.
e-mail me@example.com3The @ splits the address; the dot does not.
你好世界2No spaces: split with the browser’s dictionary. The result can vary slightly between browsers.

Unique words are compared without regard to upper and lower case, and a straight and a curly apostrophe are treated as the same. Average word length is the number of visible characters inside words divided by the number of words.

Sentences

The sentence count is an estimate. It uses the browser’s sentence segmentation and counts each segment that contains at least one letter or digit. Deciding where a sentence ends is a linguistic judgement that software gets wrong in predictable ways, so do not treat this figure as exact.

Sentence counting examples
TextSentencesWhy
Hello world. How are you? Fine!3Three terminators, three sentences.
Pi is 3.14 today.1A decimal point does not end a sentence.
Dr. Smith arrived.2An abbreviation followed by a capital letter is usually read as a sentence end. This is the main source of over-counting.
A heading⏎Then a sentence.2A line break always ends a sentence.

Lines and paragraphs

A line is a logical line of text, ended by a line break. Lines that wrap on screen because the box is narrow are not counted separately. All three kinds of line break are recognised and treated alike: line feed, carriage return, and the two together.

  • Empty text has 0 lines.
  • Text with no line break has 1 line.
  • A line break at the very end finishes the last line; it does not add an empty line after it.

A paragraph is a block of one or more lines containing text, separated from the next block by at least one blank line. A line containing only spaces or tabs counts as blank. A single line break inside a block does not start a new paragraph.

Line and paragraph examples
Text (⏎ = line break)CharactersLinesParagraphs
(empty)000
one311
one⏎two721
one⏎two⏎821
one⏎⏎two832
one⏎···⏎two⏎three (· = space)1742

Letters, numbers, emoji and the rest

The Composition figures sort every visible character into exactly one group, so they always add up to the Characters total:

  • Letters: letters in any script, with or without accents.
  • Numbers: digits in any script and numerals such as ½ or Ⅳ.
  • Punctuation & symbols: punctuation, currency signs, mathematical signs and other symbols that are not emoji.
  • Emoji: an estimate. A character is counted as emoji if it is displayed as emoji by default, if it is a pictograph explicitly marked for emoji display, or if it is a keycap such as 1️⃣. Symbols that normally display as text, such as © and ™, are counted as symbols.
  • Whitespace characters: as defined above.
  • Other: invisible control and formatting characters, including zero-width characters.

Reading and speaking time

Both are simple divisions of the word count, rounded up to the next second, and both are labelled as estimates.

  • Estimated reading time assumes 238 words per minute. That is the average silent reading rate for adults reading English non-fiction reported in a review of 190 studies (Brysbaert, 2019).
  • Estimated speaking time assumes 150 words per minute. This is a working assumption for a deliberate presentation pace, not a figure taken from a study; everyday conversation is generally faster. Time yourself if it matters.

Individual readers and speakers vary widely, and difficult or technical text is read more slowly. Treat both numbers as a rough guide.

Limits and platform presets

A custom limit is compared with the Characters figure. The meter reports how many characters are used, how many remain, and the percentage. It has four states, each shown in words as well as colour: within the limit, approaching it (from 90% used), exactly at it, and over it. Going over is reported, never prevented.

Platform presets come from a single data file that records, for each entry, the limit, its source and the date it was last checked. They are listed in full on the platform limits reference. Each preset is one of two kinds:

  • A platform limit is a maximum the platform enforces and documents.
  • A common guideline is editorial advice with no enforced maximum. Search result titles and descriptions are guidelines: Google documents no character limit for either.

Platforms also differ in how they count, and most do not say. Where a platform publishes its rules we implement them; where it does not, we count visible characters and label the preset as approximate.

X is the one platform with fully published rules. Its open-source configuration (version 3) normalises the text, then weighs each code point: most Latin characters count as 1, most others as 2, every emoji as 2 however it is built, and every link as 23. The X preset applies those rules:

X weighted counting examples
TextVisible charactersCounted by X as
hello55
🙂12
日本語36
https://example.com/a/long/address3423

One part of the X count is approximate: recognising links. X uses a full list of valid domain endings; we recognise addresses that start with http://, https:// or www., and bare domains with common endings.

SMS

The SMS Character Counter follows the encoding rules in 3GPP TS 23.038 and the concatenation rules in 3GPP TS 23.040. It does not use the text’s ordinary length at any point.

  1. Encoding. If every character is in the GSM 7-bit default alphabet or its extension table, the message is GSM-7. Otherwise the whole message is Unicode (UCS-2).
  2. Units. In GSM-7 a basic character is 1 unit and an extension character is 2. The extension characters are ^ { } \ [ ~ ] | € and the form feed. In Unicode each UTF-16 code unit is 1 unit, so most emoji are 2.
  3. Capacity. A single message holds 160 GSM-7 units or 70 Unicode units. A longer text is split into parts of 153 or 67 units, because each part carries a six-byte header used to reassemble it.
  4. Splitting. Parts are filled in order. A character is never divided between parts. That is required by the standard for two-unit extension characters; for emoji and other multi-unit characters we follow the behaviour of Android and of the segment calculators published by SMS providers. A part can therefore end a few units short, and the number of parts is not always the total divided by the capacity.
  5. Typed characters on that page is the visible-character count, shown beside the units so you can see the difference.
SMS counting examples
MessageEncodingCharactersUnits
Your parcel arrives today between 2 and 4pm.Every character is in the basic GSM-7 table, so each one uses one unit.GSM-74444
Price: €5 [approx]The euro sign and both square brackets come from the extension table and use two units each: 18 characters, 21 units.GSM-71821
We’re open until 6pm.The typographic apostrophe is not in GSM-7, so the whole message is sent as Unicode with a 70-unit capacity.Unicode (UCS-2)2121
See you at 8 🎉The emoji forces Unicode and is itself a surrogate pair, so it uses two units.Unicode (UCS-2)1415

Optional replacements are offered only for typographic punctuation and spacing that has an obvious GSM-7 equivalent: curly quotation marks, dashes, the ellipsis, the non-breaking space and similar. Letters are never transliterated, because that would change spelling, and nothing is replaced unless you press the button.

A note on one character: the 3GPP standard and the major providers’ documentation place the capital Ç in GSM-7 and treat the small ç as outside it, and so do we. A mapping file published by the Unicode Consortium does the opposite, so tools built from that file can disagree with this one about that letter.

Known limitations

  • Sentences and emoji counts are estimates, as described above.
  • Results depend on your browser’s Unicode data. Very new emoji and some word boundaries in languages written without spaces can differ between browsers.
  • Most platform presets are approximate because the platforms do not publish their counting unit. Each preset says which kind it is.
  • Search guidelines are not limits. What a search engine displays depends on the width of the text and the device, and it may rewrite your title or description.
  • SMS results follow the standard, not your provider. Providers and carriers can replace characters, cap length, use national character tables or bill differently. National language shift tables are not modelled.
  • Limits change. Every platform entry shows the date it was last verified and links to its source.

If you find a case where a number on this site is wrong or unclear, please tell us. Corrections are handled as described in the editorial policy.