Zerowidth CleanerAll measured guides

CLAUDE WATERMARK REMOVER · PRACTICAL TEST

Why does kilometer format successfully while km throws RangeError?

Our unit formatter accepts kilometer and meter-per-second, but rejects km. Removing an inserted U+200B repairs kilo plus meter to kilometer. The accepted option identifier is separate from its displayed abbreviation or long label.

Tested October 26, 2026 · v24.22.1 · 4 measured runs

Open the Claude text cleaner · Full measured data

Code-point comparison for Marked unit

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
Marked unit
direct string / keep / invisible true
"kilo​meter"
U+006B U+0069 U+006C U+006F U+200B U+006D U+0065 U+0074 U+0065 U+0072
"kilometer"
Removed 1 invisible character
{"error":"RangeError"}
{"formatted":"2 kilometers","unit":"kilometer"}
Valid unit
direct string / keep / invisible true
"kilometer"
U+006B U+0069 U+006C U+006F U+006D U+0065 U+0074 U+0065 U+0072
"kilometer"
No selected invisible characters found
{"formatted":"2 kilometers","unit":"kilometer"}
{"formatted":"2 kilometers","unit":"kilometer"}
Display abbreviation
direct string / keep / invisible true
"km"
U+006B U+006D
"km"
No selected invisible characters found
{"error":"RangeError"}
{"error":"RangeError"}
Compound unit
direct string / keep / invisible true
"meter-per-second"
U+006D U+0065 U+0074 U+0065 U+0072 U+002D U+0070 U+0065 U+0072 U+002D U+0073 U+0065 U+0063 U+006F U+006E U+0064
"meter-per-second"
No selected invisible characters found
{"formatted":"2 meters per second","unit":"meter-per-second"}
{"formatted":"2 meters per second","unit":"meter-per-second"}

The cleaned option reaches a valid identifier

The marked fixture supplies kilo followed by U+200B and meter as the unit option, with style unit and unitDisplay long. Construction initially throws RangeError. After deletion, resolvedOptions reports kilometer and formatting the fixed number two yields 2 kilometers. The plain kilometer reference reaches the same result without cleanup. Capturing the constructor error separately from formatted output shows that the original failure occurs in option validation, before the formatter can produce a display label. The cleaner does not infer or translate unit names.

A familiar display abbreviation is not the option spelling

The km reference remains RangeError before and after cleanup, with no selected invisible character found. The compound reference meter-per-second succeeds and produces 2 meters per second. These controls distinguish valid identifier syntax from ordinary human shorthand, and show one accepted compound form without claiming to enumerate every unit. The quantity, locale and display width stay fixed in all four rows. Therefore a result difference cannot be attributed to a changed number, plural category chosen from a different input, or an automatic locale negotiation between tests.

Keep a typed mapping between UI labels and unit options

When a UI displays abbreviations, store the accepted option identifier separately rather than passing the visible label directly to Intl.NumberFormat. Validate the identifier against the supported contract and preserve errors that remain after cleanup. Do not delete letters or guess a unit merely to suppress a RangeError. This matrix tests two accepted identifiers and two rejected spellings in the recorded runtime, not a complete compatibility list. The primary specification defines the identifier check; runtime and locale data should remain with a reproducible formatting record.

A successful label does not validate a measurement

The number two is authored and has no sensor or real-world meaning. The experiment does not convert units, parse a measurement, verify a physical dimension or inspect a file. Earlier currency coverage checks a different option, while number roundtrip coverage asks whether display text can be parsed back. Here the exact question is which unit spelling the constructor accepts. No Claude conversation or detector is used. Repairing one interrupted identifier establishes a local string and API result only, with no statistical-watermark or authorship conclusion.

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 IsWellFormedUnitIdentifier 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.