What Zalgo Text Is, and What It Costs

What Zalgo Text Is, and What It Costs

Zalgo text, glitch text, cursed text and corrupted text are four names for the same effect: ordinary letters with Unicode combining marks stacked on top of them, where every mark is a character that counts against whatever limit you are writing into. No font is involved and nothing is corrupted: the base letters are still h, e, l, l, o, with accents piled above and below until they spill into the lines around them. That is why it pastes anywhere plain text is accepted, and it is also why platforms remove it. At a typical 15 marks per letter, a five-letter word becomes 80 characters and 155 bytes, so a 280-character post holds about 17 Zalgo letters and a 150-character bio holds about nine.

Why does it paste anywhere?

Because it is plain text with nothing attached. Combining marks are ordinary Unicode characters that instruct the renderer to draw a mark over, under or through the character before them; no font, no styling and no markup is carried along. Anywhere that accepts text accepts them, which is exactly why Zalgo spread through chat applications and comment sections rather than staying in design tools.

The same property is the cost. Because the marks are characters, everything that counts characters counts them too, and the next section is where that becomes a problem.

What does it cost you in characters?

Each mark is one more character and two more bytes. The table below is the word hello with marks stacked evenly on every letter, measured against character count and UTF-8 byte count.

The word “hello” at four stacking densities. Measured with Python’s unicodedata, 2026-08-11.
Marks per letter Characters UTF-8 bytes Letters you can read
1 10 15 5
5 30 55 5
15 80 155 5
50 255 505 5

Two limits people meet immediately: a 280-character post fits roughly 17 Zalgo letters at 15 marks each, and a 150-character bio fits about nine. At 50 marks per letter, five letters take 505 bytes (a hundred times the five bytes the plain word needs) which is why storage and message systems cap it long before a human complains.

Why do platforms strip it?

Two mechanisms remove Zalgo, and they are not the same thing. Normalisation rewrites the string into a canonical form, folding marks into precomposed characters where one exists and leaving a shorter, tamer result. A mark cap counts combining marks per base character and refuses or truncates anything above a threshold. The first is usually applied to identifiers such as usernames; the second to message bodies.

The reason is layout rather than taste. Stacked marks are drawn outside the line box they belong to, so a Zalgo message overlaps the messages above and below it: text that damages other people’s content is the kind a platform removes.

Does normalisation remove the marks?

Yes, both NFC and NFKC change the string. One page ranking for this question states that normalisation does not simply erase combining marks. Measured on the same 80-character string used above, NFC returns 78 characters and NFKC also reduces it, because each form composes what it can into single precomposed characters and leaves the rest as a shorter stack.

What survives is worth stating precisely: normalisation does not delete every mark, and it is not a filter. It reduces the pile, and where a platform combines it with a mark cap the visible effect is that Zalgo simply stops working there.

How do you detect it in your own input?

Count combining marks per base character and set a ceiling. Two or three marks on a letter is ordinary written language (Vietnamese, Yoruba and transliterated Arabic all stack legitimately) while fifteen is decoration, which is the threshold the Codidact answer on this question argues about at length. A rule that rejects anything above a small per-character count keeps real languages working and stops the stacking, and it needs no list of forbidden characters.

What do screen readers do with it?

The base letters are still there, so the word is still announced; the marks are read out, skipped or spelled depending on the reader and its verbosity setting. Nothing about the text is unreadable to software, which is the honest framing for anyone deciding whether to use it in something that matters. Zalgo is a display effect that everyone’s assistive technology has to walk through character by character.

Glitch, cursed, corrupted: are they the same thing?

What is Zalgo text, and is glitch text something different? They are one effect under four names, and the search engines treat them as one query. Glitch text, cursed text and corrupted text all describe the stacking above, and glitch font is the odd one out because no font is involved at all: the effect travels in the characters, which is why it survives a copy into an application that has never heard of it.

What the names hide is that the generators are not all producing the same thing. Classifying every non-ASCII character across the ten pages ranking for this effect, only two of them build it from combining marks alone. Seven of the ten mix two or more different kinds of character, and four mix five kinds at once.

Bar chart showing combining marks on nine of ten ranking pages, seven of ten mixing two or more character families, four mixing five, and only two using combining marks alone
Every non-ASCII character on each of the ten ranking pages, classified by Unicode category and name.

What a glitch string is actually made of

Usually more than one mechanism. Combining marks appear on nine of the ten pages, which is what everything above this section describes, but they are rarely the only ingredient. The five families that turn up, with what compatibility normalisation does to each:

  • Combining marks, the accents and strikes stacked on a base letter. Present on 9 of 10 pages. NFKC does not remove them.
  • Compatibility variants, such as fullwidth or circled letters. Present on 6 of 10. NFKC folds these back to plain ASCII.
  • Substituted Latin letters, such as a barred L or a crossed T. Present on 5 of 10. NFKC leaves them alone, because they are letters in their own right rather than variants of L and T.
  • Greek and Cyrillic lookalikes, letters from another script chosen for their shape. Present on 5 of 10. NFKC leaves them alone for the same reason.
  • Currency signs used as letter substitutes. Present on 4 of 10. NFKC leaves them alone.

The instrument is simple enough to repeat: take each ranking page’s extracted text, strip the link targets so URLs contribute nothing, then classify every non-ASCII character by its Unicode category and name. A family counts as present at three characters or more.

One limit belongs with the numbers. This counts what each page displays, which is its interface and its sample output, not the entire output space of its generator. A page whose sample happens to use one family may well offer others behind a control this pass did not press.

Why half of it normalises and half does not

Because the families are different kinds of character, and only one of them is defined by the Unicode Standard as a presentational variant of something else. Compatibility variants fold to plain ASCII under NFKC, which is the whole point of a compatibility decomposition. Combining marks do not fold: the word glitch carrying two marks per letter is 18 codepoints before normalisation and 18 codepoints after. Substituted letters do not fold either, because a barred L is its own letter and normalisation has nothing to fold it into.

The practical consequence is the part worth carrying away. A single pasted word can normalise in part and not in part. The fullwidth letters in it collapse to ASCII while the marks and the substituted letters stay exactly where they are, so the same string can be found by a search that normalises and missed by one that does not, and a validator can accept half of it and reject the rest. If you need a styled name that a field will actually keep, why a styled username gets rejected covers which fields validate and which merely render.

Five cards showing that NFKC folds compatibility variants to plain letters but leaves combining marks, substituted Latin letters, Greek and Cyrillic lookalikes and currency signs untouched
The five families that turn up in a glitch string, and what compatibility normalisation does to each.

Frequently asked questions

These come up alongside the main question and are answered here rather than in sections of their own.

Does Zalgo text need a special font?

No. Combining marks are part of Unicode and every modern renderer stacks them. That is why the same string looks the same in a browser, a chat window and a text editor, and why nothing has to be installed to see it.

How much stacking is too much?

Past roughly 15 marks per letter the text overlaps its neighbours and platforms begin to truncate or reject it. The cost table shows the other reason to stop there: 15 marks already turns a five-letter word into 80 characters.

Can search engines read cursed text?

The base letters remain in the string, so the word is extractable, but the marks sit between them and the result is unpredictable in any exact match. Treat Zalgo as decoration and keep anything that needs to be found in plain letters.

Zalgo text is ordinary text with a large number of extra characters: that is what makes it paste anywhere, what makes normalisation reduce it, and what makes it expensive: 80 characters to say a five-letter word, or 255 if the stacking is heavy. Generate it with the Zalgo generator, count what it costs before pasting it into a field with a limit, and expect any platform that normalises identifiers to hand it back plain.