What tag characters are
Unicode reserves the range U+E0000 to U+E007F for "tag characters". U+E0020 through U+E007E mirror printable ASCII exactly: U+E0041 corresponds to "A", U+E0061 to "a", and so on.
They were originally intended for language tagging, a use that was deprecated almost immediately. What remained is a block of codepoints that map cleanly onto ASCII and render as absolutely nothing in every mainstream font and text engine.
That combination makes them an ideal covert channel. Any string can be converted character by character into tag characters, appended to ordinary text, then left completely invisible while remaining perfectly recoverable by anything that reads the bytes.
ASCII smuggling and prompt injection
This technique has a name in security work: ASCII smuggling. It matters well beyond watermarking.
Because large language models read the raw character stream rather than the rendered glyphs, a tag-character payload that is invisible to the human reviewing a document is fully legible to the model processing it. An instruction hidden this way inside a CV, a support ticket, a web page or an email can be read and acted on by an AI agent while the person who approved the document saw nothing unusual.
The same property makes tag characters a clean watermarking channel: an identifier can be embedded in text and survive copy, paste, reformatting without ever being visible.
If you are reviewing documents that will be processed by an AI system, checking for this block is a genuine security control, not just a curiosity.
The one legitimate use
Regional and subdivision flag emoji are built from tag characters. The Scotland flag 🏴 is a waving black flag base followed by the tag characters for "gbsct" and a terminator.
That means a tool cannot simply delete every tag character without breaking those emoji. This one parses the sequence structure: a complete, well-formed flag sequence (base, valid tag run, terminator) is recognised and kept. Tag characters appearing anywhere else, or in a malformed run, are treated as a payload and removed.
When a payload is found, the report shows you the count and position. Because the mapping to ASCII is one-to-one, a run of tag characters in your text is almost always a readable string that somebody chose to hide there.