CLAUDE WATERMARK REMOVER ยท PRACTICAL TEST
Does the character counter count visible symbols?
The homepage counts Unicode code points using spread syntax. Our fixtures show that a joined emoji and an accented cluster can each display as one symbol while contributing multiple code points.
Open the Claude text cleaner ยท Full measured data
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. Invisible removal is enabled; the dash mode appears in each row. The observations below test this page's specific question. We make no detector-score or statistical-watermark removal claim.
| Fixture and mode | Input string and code points | Output and cleaner status | Observed before / after |
|---|---|---|---|
| Supplementary symbol direct string / keep | "๐"U+1F600 | "๐"No selected invisible characters found | {"codePoints":1,"utf16":2,"graphemes":1}{"codePoints":1,"utf16":2,"graphemes":1} |
| Joined technologist direct string / keep | "๐ฉโ๐ป"U+1F469 U+200D U+1F4BB | "๐ฉโ๐ป"No selected invisible characters found | {"codePoints":3,"utf16":5,"graphemes":1}{"codePoints":3,"utf16":5,"graphemes":1} |
| Decomposed accent direct string / keep | "eฬ"U+0065 U+0301 | "eฬ"No selected invisible characters found | {"codePoints":2,"utf16":2,"graphemes":1}{"codePoints":2,"utf16":2,"graphemes":1} |
| Emoji plus deleted marker direct string / keep | "๐โ"U+1F600 U+200B | "๐"Removed 1 invisible character | {"codePoints":2,"utf16":3,"graphemes":2}{"codePoints":1,"utf16":2,"graphemes":1} |
Three counts answer different questions
The supplementary smile has one code point and two UTF-16 units. The technologist sequence has three code points and five units, while the grapheme segmenter groups it as one cluster. The decomposed accent has two code points and two units, grouped as one cluster. The final fixture shows the deletion of U+200B and its effect on all three counters. The homepage uses spread syntax for its displayed character counts; it does not call Intl.Segmenter.
Grapheme counts are measured separately
Our Node observer applies Intl.Segmenter with an English locale and grapheme granularity. The saved runtime and results state which engine produced those cluster counts. Unicode Annex #29 provides segmentation rules; implementations and Unicode versions can differ. This experiment does not inspect glyph rendering, cursor navigation, word count or a destination service quota. A user-perceived symbol, a code point and a UTF-16 unit should not be silently treated as interchangeable measures.
Match the counter to the actual limit
When an application rejects text as too long, check its documented counting unit. Compare a short representative fixture with its actual counter, especially if the text contains emoji or combining marks. Use our code-point count to understand this cleaner and a separate destination count to validate a field limit. Removing a selected character reduces the stored sequence, but it cannot guarantee compliance with another system quota. Preserve meaningful joiners and accents; a smaller count alone is not a reason to strip them.
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.cjsReference and next check
Unicode text segmentation 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.