Unicode guide
Invisible and Confusable Characters: Hidden Risks in Copied Text
Copied text can contain characters that are not obvious from its appearance. Inspection, script detection, and confusable checks expose code points that can change counts, matching, or visual order.
Invisible and zero-width characters
U+200B ZERO WIDTH SPACE, U+200D ZERO WIDTH JOINER, and U+200C ZERO WIDTH NON-JOINER do not normally occupy visible width. They can sit inside copied text, change its counts, or prevent an exact match without being seen.
Joiners and non-joiners also have legitimate roles in text shaping and emoji sequences. Their presence is therefore something to inspect in context, not proof that the text is harmful.
paypalU+200B · Zero-width · InvisibleGlyphSift's inspector reveals the ZERO WIDTH SPACE between “pay” and “pal,” even though the input may look continuous.
Bidirectional controls can change display order
Characters in U+202A–U+202E and U+2066–U+2069 participate in bidirectional ordering. They can change how surrounding text is displayed without changing the logical order in which all code points are stored.
This behavior supports bidirectional text, but controls can also be placed deceptively. Character inspection can reveal the controls so the stored sequence and its rendered order can be reviewed separately.
Confusables and mixed scripts
Confusable characters belong to different scripts but have similar shapes. Latin a at U+0061 and Cyrillic а at U+0430 are different code points even though they can look alike in some fonts.
Substituting such characters is a basis for spoofed names and phishing URLs. Mixed-script detection shows when letters from multiple writing systems occur together, while confusable checking identifies supported lookalikes and the character inspector exposes their exact code points.
Primary standards