Unicode guide

What Is a Hidden Character?

A hidden character is a Unicode code point that affects the way text is stored, searched, displayed, or copied without appearing as an ordinary visible symbol. Zero-width spaces, non-breaking spaces, directional marks, and byte-order marks are common examples.

Magnifying glass revealing highlighted invisible marks and U+200B in a text string
A Unicode-aware view makes an invisible code point inspectable without changing the original text.

Common Types of Hidden Characters

The phrase “hidden character” is broad. It can describe a character that has no visible glyph, a spacing character that looks like an ordinary space, or a formatting control that changes direction or joining behavior. The distinction matters because cleaning every unusual code point in the same way can damage a document.

Zero-width characters

Zero-width characters occupy no visible width in most contexts. A zero-width space can mark a possible line-break location, while a zero-width joiner can influence how adjacent symbols combine. They are legitimate Unicode characters, but they can also appear accidentally when text is copied from a web page, editor, PDF, or messaging application.

The most familiar examples are U+200B ZERO WIDTH SPACE, U+200C ZERO WIDTH NON-JOINER, and U+200D ZERO WIDTH JOINER. U+FEFF is commonly called a byte-order mark, or BOM, at the beginning of a file. Inside ordinary text, the same code point is named ZERO WIDTH NO-BREAK SPACE and is usually worth inspecting.

Non-breaking and Unicode spaces

Not every invisible-looking character is zero width. U+00A0 NO-BREAK SPACE looks like a normal space but prevents a line break between the surrounding words. Unicode also defines EN SPACE, EM SPACE, THIN SPACE, and HAIR SPACE from U+2000 through U+200A. These can be intentional typographic choices, but they can also make search, validation, or string comparison behave differently from expected.

Formatting and bidirectional controls

Some characters influence how a sequence is interpreted without rendering a visible mark. LEFT-TO-RIGHT MARK, RIGHT-TO-LEFT MARK, embedding controls, overrides, and isolates help text support multiple writing directions. They are important for internationalized text, yet they deserve attention when a filename, source string, or copied sentence appears to be reversed or does not compare correctly.

Hidden Character Code Points to Know

CharacterCode pointWhat it can affect
ZERO WIDTH SPACEU+200BInvisible break opportunities and string comparisons
ZERO WIDTH NON-JOINERU+200CJoining behavior in scripts that use contextual forms
ZERO WIDTH JOINERU+200DJoining behavior and emoji sequences
NO-BREAK SPACEU+00A0Line wrapping, search, and exact string matching
RIGHT-TO-LEFT OVERRIDEU+202EThe visual direction of following text
WORD JOINERU+2060Preventing breaks without visible width
ZERO WIDTH NO-BREAK SPACE (BOM)U+FEFFFile encoding markers and pasted text artifacts

The code point is more reliable than the appearance. For example, these visible examples communicate the difference without hiding a real character in the article: A[U+200B]B has a zero-width space between the letters, while A[U+00A0]B has a non-breaking space.

Why Hidden Characters Cause Real Problems

Search engines and programming languages compare stored characters, not only the shapes a browser draws. A username containing U+200B may look identical to a clean username but fail an exact lookup. A CSV value containing U+00A0 may not match a value containing U+0020. A bidirectional override can make a log line or filename harder to read. In a publishing workflow, an invisible mark can also survive multiple rounds of copying and make it difficult to explain why two apparently identical paragraphs produce different results.

These characters are not automatically dangerous. They are part of the Unicode standard and can serve real linguistic or typographic purposes. The practical question is whether the character belongs in the specific text you are working with.

How to Find Hidden Characters in Copied Text

Start with the smallest suspicious sample. Paste it into a detector that reports code points and names, rather than relying on a visual editor alone. A useful result should show the character in context, count repeated occurrences, and leave the original input unchanged until you decide to clean it.

For a quick inspection, use the Hidden Character Detector and look for the highlighted marker above each unusual position. The result table groups repeated code points, which helps distinguish one accidental mark from a repeated formatting pattern.

How to Remove Them Safely

Create a separate clean copy instead of editing the source destructively. Zero-width and formatting controls can usually be removed when they are not intentional. Unicode spaces are different: replacing U+00A0 or U+2009 with an ordinary space often preserves the sentence better than deleting the space and joining two words. After cleaning, inspect the result again and confirm that the target code points are gone.

The right cleanup policy depends on the text. A linguist, localization specialist, or developer working with bidirectional scripts may need to preserve certain marks. When in doubt, record the code point, its context, and the reason for removing it.

Try the Hidden Character Detector