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. They are folded to a plain line feed rather than deleted, because 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, since 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.
Terminal quote bars
Governed by Quote bars --gutters
The bar a terminal draws down the left of a quoted block, which is copied as text at the start of every line along with the quote. A bar counts only when it opens its line and the same glyph does not appear again later on that line, so a table drawn with box characters is left alone. It goes with the one space after it. Opt-in, because a folder tree printed in a terminal starts its lines with the same bar.
| Codepoint | Name | Default pass |
|---|
| U+2502 | │ BOX DRAWINGS LIGHT VERTICAL | No |
| U+2503 | ┃ BOX DRAWINGS HEAVY VERTICAL | No |
| U+258C | ▌ LEFT HALF BLOCK | No |
| U+258D | ▍ LEFT THREE EIGHTHS BLOCK | No |
| U+258E | ▎ LEFT ONE QUARTER BLOCK | No |
| U+258F | ▏ LEFT ONE EIGHTH BLOCK | No |
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, and one only counts inside a mixed-script word: a run of letters that also contains an ASCII letter or digit, like "аpple". A pure Cyrillic or Greek word is never reported and never rewritten. Opt-in even so, because it rewrites letters you can see.