Zerowidth CleanerAll measured guides

CLAUDE WATERMARK REMOVER · PRACTICAL TEST

Can parseInt return a number while ignoring a hidden suffix?

Yes. Our parseInt with radix 10 reads 12 from 12 + U+200B + 34; cleaning changes the result to 1234. A finite prefix result is not full-string validation.

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

Open the Claude text cleaner · Full measured data

Code-point comparison for Marker after prefix

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 after prefix
direct string / keep / invisible true
"12​34"
U+0031 U+0032 U+200B U+0033 U+0034
"1234"
Removed 1 invisible character
{"parseInt10":12,"prefixAccepted":true,"number":null,"wholeConversionFinite":false}
{"parseInt10":1234,"prefixAccepted":true,"number":1234,"wholeConversionFinite":true}
Trailing letters
direct string / keep / invisible true
"12abc"
U+0031 U+0032 U+0061 U+0062 U+0063
"12abc"
No selected invisible characters found
{"parseInt10":12,"prefixAccepted":true,"number":null,"wholeConversionFinite":false}
{"parseInt10":12,"prefixAccepted":true,"number":null,"wholeConversionFinite":false}
Leading marker
direct string / keep / invisible true
"​1234"
U+200B U+0031 U+0032 U+0033 U+0034
"1234"
Removed 1 invisible character
{"parseInt10":null,"prefixAccepted":false,"number":null,"wholeConversionFinite":false}
{"parseInt10":1234,"prefixAccepted":true,"number":1234,"wholeConversionFinite":true}
Plain integer
direct string / keep / invisible true
"1234"
U+0031 U+0032 U+0033 U+0034
"1234"
No selected invisible characters found
{"parseInt10":1234,"prefixAccepted":true,"number":1234,"wholeConversionFinite":true}
{"parseInt10":1234,"prefixAccepted":true,"number":1234,"wholeConversionFinite":true}

A partial result can hide the interruption

The first input deliberately places U+200B after the two-digit prefix. parseInt returns twelve before cleanup even though Number rejects the entire spelling. Once deletion joins all four digits, both observers return 1234. The trailing-letters reference also yields a finite prefix and a rejected whole conversion, but cleanup changes nothing because those letters are not selected markers. The leading-marker fixture initially has no accepted digit prefix and is repaired by its deletion. The plain reference agrees throughout. Explicit booleans separate rejected values from JSON null representations and retain the distinction between prefix acceptance and whole conversion.

Radix and parser choice are recorded

We invoke parseInt with radix ten rather than depending on inferred radix rules. This is an extension of the small Number guide with a different parser contract: consumption may stop before the end of the input. Neither observer is a complete application validator. The tests exclude exponent notation, signed values, locale separators and another runtime language. The cleaner does not call parseInt or verify that every character was consumed. ECMAScript describes the prefix processing used here. We do not assign a cause to an unknown pasted string, and all known interruptions were placed intentionally in synthetic examples.

Reject unconsumed text when the field requires it

Preserve the original field and define the complete integer grammar expected by the application. If the field must contain only the permitted integer representation, validate that requirement separately from a successful prefix parse. A targeted deletion should be justified by the intended digits because twelve and 1234 are different values, even though both conversion results are finite. Run the actual destination validation after editing and reject unknown trailing content rather than silently discarding it. This matrix demonstrates the recorded parser boundary, not a general technique for repairing arbitrary numeric records or confirming their meaning.

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

ECMAScript parseInt 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.