Zero-width and invisible
Governed by Default pass (always on)
Characters with no glyph and no width that are contraband anywhere in prose: zero width space, word joiner, soft hyphen, the byte order mark, the four invisible maths operators, deprecated format controls, interlinear annotation marks, musical-notation controls and Unicode’s permanently reserved noncharacters.
Bidirectional overrides
Governed by Default pass (always on)
The five embedding and override controls. They reorder text that is not theirs, which is how a filename can be displayed as something it is not. There is no context in which Ghostchars keeps one.
Bidirectional marks
Governed by Bidi marks --bidi
Direction hints — the left-to-right and right-to-left marks, the Arabic letter mark, and the four isolates. Next to right-to-left text they resolve genuine ambiguity and are kept; in an English paragraph they are invisible padding and a published steganography carrier, and they go.
Joiners, selectors and fillers
Governed by Aggressive -a
Invisible characters that bind to the character before or after them: zero width joiner and non-joiner, variation selectors, tag characters, and the script-specific fillers of Mongolian, Khmer and Hangul. Kept when their neighbours make them load-bearing, removed when they are free-floating.
Any other format control
Governed by Default pass (always on)
The catch-all. Every remaining character whose Unicode general category is Cf is removed, so a format control added in a future Unicode version is caught without a code change. The orthographic exceptions — the Arabic number signs, the Syriac abbreviation mark, the Kaithi number sign — are matched earlier and left alone.
Detected by Unicode property rather than from a list, so there is no fixed set of codepoints to enumerate.
Private-use characters
Governed by Private-use characters --pua
Codepoints Unicode will never assign, whose meaning is a private agreement between a font and an application. Icon fonts live here, which is why removing them is opt-in: in UI copy they are the content.
Exotic spaces
Governed by Spaces -s
Spaces that are not U+0020: the no-break space, the narrow and medium ones, the ideographic space, the Ogham space mark and the eleven fixed-width typographic spaces. They are replaced with an ordinary space rather than deleted, because they are separating words.
Line separators
Governed by Line endings -n
Unicode’s line and paragraph separators and the EBCDIC-derived NEL. Folded to a plain line feed rather than deleted — deleting them would run two lines together.
Control characters
Governed by Control characters --controls
The C0 and C1 control codes, excluding tab, line feed and carriage return. Their presence in text usually means a decoding accident or a deliberate probe.
Typographic punctuation
Governed by Punctuation --punct
Curly quotes, em and en dashes, the ellipsis, the minus sign and the primes. Nothing is hidden here — these are visible characters — but they are a different codepoint from their ASCII forms, and the straight-versus-curly choice is a published one-bit-per-apostrophe channel.
Lookalike letters
Governed by Lookalike letters --confusables
Cyrillic, Greek, Armenian, Cherokee, fullwidth and mathematical letters that are drawn identically to Latin ones. The mapping has 1,513 entries generated from Unicode’s own confusables data. Opt-in, because applying it destroys genuine non-Latin text.