Skip to content
Ghostchars

Bidirectional marks

BIDIRECTIONAL ISOLATES (U+2066–U+2069)

Four invisible controls — LRI, RLI, FSI and PDI — that wrap a span of text so its direction cannot leak into the text around it. They are the modern replacement for the embedding and override controls.

Range
U+2066–U+2069
Removed by default
When free-floating
Governing option
Bidi marks --bidi
Can be load-bearing
Yes

Where it comes from

Localisation frameworks, which wrap interpolated variables in isolates so a user-supplied Arabic name cannot rearrange the English sentence around it. Also from any editor that produces correct mixed-direction text.

Why it matters

They are the right tool, which is exactly why they need care: unmatched isolates are common in text that has been cut and pasted, and they are just as invisible as the controls they replaced.

Before and after

BeforeHello U+2066nameU+2069!
AfterHello name!

An interpolated variable wrapped in an isolate pair — correct in the template, pointless once the value is plain English.

The character is shown as a labelled chip so you can see where it sits. In your text it draws nothing at all.

When it is legitimate

Around a span of text whose direction should not affect its surroundings. Ghostchars keeps an isolate that sits next to right-to-left text and removes one floating in a left-to-right paragraph.

How to remove it

Removed by the default pass when no neighbour is right-to-left; kept and reported when one is. `--bidi` removes them everywhere.

Is it an AI watermark?

Not a watermark

No. Isolates come from localisation frameworks and modern editors. They are evidence of good bidi practice somewhere upstream.

No connection to machine-generated text. It comes from software, from a keyboard, or from a person.

Questions

What are the four?

U+2066 LEFT-TO-RIGHT ISOLATE, U+2067 RIGHT-TO-LEFT ISOLATE, U+2068 FIRST STRONG ISOLATE (which takes the direction of the first strong character inside it) and U+2069 POP DIRECTIONAL ISOLATE, which closes any of them.

Why are they better than embeddings?

Because the text inside an isolate cannot influence the direction of the text outside it. An unterminated embedding rearranges the rest of the paragraph; an isolate cannot.

Check your own text

Paste anything into the cleaner to see every hidden character it contains, with position, codepoint and what happens to each one. Nothing is uploaded.

Check your own textAll characters