Zerowidth CleanerAll measured guides

CLAUDE WATERMARK REMOVER · PRACTICAL TEST

How can I keep a complete visual character when shortening cleaned text?

Segment the cleaned string by grapheme before taking its prefix. In our fixtures, this retains the complete accented e, family emoji and flag; taking one code point or UTF-16 unit does not.

Tested October 13, 2026 · v24.19.0 · 4 measured runs

Open the Claude text cleaner · Full measured data

Code-point comparison for Marker before accent

Measured inputs and outputs

These are locally constructed test strings, not evidence that Claude inserts these characters. We executed the saved homepage script snapshot with a minimal DOM harness and compared exact strings. The invisible-checkbox state and dash mode appear in each row. The observations below test this page's specific question. Destination observations run independently on the exact input and cleaned strings in the recorded Node runtime. We make no detector-score or statistical-watermark removal claim.

Before and after observations; full code points and strings are in the JSON download.
Fixture and modeInput string and code pointsOutput and cleaner statusObserved before / after
Marker before accent
direct string / keep / invisible true
"​éX"
U+200B U+0065 U+0301 U+0058
"éX"
Removed 1 invisible character
{"segments":["​","é","X"],"firstGrapheme":"​","firstCodePoint":"​","firstUnit":"​"}
{"segments":["é","X"],"firstGrapheme":"é","firstCodePoint":"e","firstUnit":"e"}
Family emoji
direct string / keep / invisible true
"👩‍👩‍👧‍👦X"
U+1F469 U+200D U+1F469 U+200D U+1F467 U+200D U+1F466 U+0058
"👩‍👩‍👧‍👦X"
No selected invisible characters found
{"segments":["👩‍👩‍👧‍👦","X"],"firstGrapheme":"👩‍👩‍👧‍👦","firstCodePoint":"👩","firstUnit":"\ud83d"}
{"segments":["👩‍👩‍👧‍👦","X"],"firstGrapheme":"👩‍👩‍👧‍👦","firstCodePoint":"👩","firstUnit":"\ud83d"}
Flag pair
direct string / keep / invisible true
"🇬🇧X"
U+1F1EC U+1F1E7 U+0058
"🇬🇧X"
No selected invisible characters found
{"segments":["🇬🇧","X"],"firstGrapheme":"🇬🇧","firstCodePoint":"🇬","firstUnit":"\ud83c"}
{"segments":["🇬🇧","X"],"firstGrapheme":"🇬🇧","firstCodePoint":"🇬","firstUnit":"\ud83c"}
ASCII control
direct string / keep / invisible true
"ABX"
U+0041 U+0042 U+0058
"ABX"
No selected invisible characters found
{"segments":["A","B","X"],"firstGrapheme":"A","firstCodePoint":"A","firstUnit":"A"}
{"segments":["A","B","X"],"firstGrapheme":"A","firstCodePoint":"A","firstUnit":"A"}

Three prefix operations return different strings

We compare a one-unit slice, the first code point and the first grapheme from the same supplied string. Before cleanup, the marked accent example starts with a separate U+200B segment. After deletion its first grapheme is e plus a combining acute accent, while both simpler operations return only e. The family fixture retains its joiners and forms one family segment; the code-point operation returns just the first woman. The flag forms one segment from two regional indicators; selecting its first code point keeps only one indicator. The ASCII control produces A under every operation. The table records complete segment arrays so these differences remain inspectable without depending on a font.

A grapheme boundary is a separate destination policy

Our earlier slice article shows an unmatched surrogate created by a one-unit operation. Here the question goes further: even a complete code point may be only part of a displayed character. We execute Intl.Segmenter with English and grapheme granularity, not a word or sentence iterator. The homepage preserves the complete family and flag in these fixtures; the later prefix operation chooses what to retain. Segmentation depends on the runtime Unicode implementation, which is recorded with the downloads. We do not measure terminal columns, proportional-font widths, platform emoji appearance or a complete input-field quota. Four selected strings cannot establish every possible visual boundary in every application.

Shorten the intended representation deliberately

Keep the complete edited string as a reference and decide whether the destination quota counts units, bytes, code points or grapheme clusters. When it requires a visual prefix, segment the exact version being shortened and select complete segments. Do not treat a smaller removal counter as evidence that a prefix is intact: the family and flag controls have no selected removals yet the simpler prefixes still differ. Our reproducer shows the concrete array and three prefixes for each stage. It does not implement ellipsis budgeting or truncation of styled HTML. Review the final destination display as well as the stored string, and retain the original when an edit or length limit needs to be reversed.

Reproduce this test

Save reproduce.cjs and tested-app.js in the same folder. Run the command below with Node.js. The harness prints its runtime, script SHA-256 and every measured row. Compare those rows with the original record. Using a newer script or runtime creates a new experiment; retain the version information with your rerun.

node reproduce.cjs

Reference and next check

ECMA-402 Intl.Segmenter provides the relevant primary definition. The table and fixture analysis are original measurements. For broader inspection, use our Unicode inspector. Read the scope distinction before interpreting cleanup as a watermark result.