CLAUDE WATERMARK REMOVER · PRACTICAL TEST
Why does normalize throw for nfc even when NFC works?
Our normalize form nfc throws RangeError; NFC succeeds. Deleting U+200B from an interrupted NFC repairs the argument. With the fixed sample, NFC keeps the fullwidth A while NFKC changes it to ASCII A. Choose the form deliberately.
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. 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.
| Fixture and mode | Input string and code points | Output and cleaner status | Observed before / after |
|---|---|---|---|
| Marked form direct string / keep / invisible true | "NFC"U+004E U+0046 U+200B U+0043 | "NFC"Removed 1 invisible character | {"accepted":false,"errorName":"RangeError"}{"accepted":true,"output":"Aé","codepoints":["ff21","e9"]} |
| Canonical form direct string / keep / invisible true | "NFC"U+004E U+0046 U+0043 | "NFC"No selected invisible characters found | {"accepted":true,"output":"Aé","codepoints":["ff21","e9"]}{"accepted":true,"output":"Aé","codepoints":["ff21","e9"]} |
| Wrong case direct string / keep / invisible true | "nfc"U+006E U+0066 U+0063 | "nfc"No selected invisible characters found | {"accepted":false,"errorName":"RangeError"}{"accepted":false,"errorName":"RangeError"} |
| Compatibility form direct string / keep / invisible true | "NFKC"U+004E U+0046 U+004B U+0043 | "NFKC"No selected invisible characters found | {"accepted":true,"output":"Aé","codepoints":["41","e9"]}{"accepted":true,"output":"Aé","codepoints":["41","e9"]} |
This experiment cleans the option rather than the sample
Each supplied input is used as the form argument for normalizing one fixed sample consisting of fullwidth A followed by e and a combining acute accent. The marked NF plus U+200B plus C argument initially throws RangeError. After the homepage callback removes the inserted marker, the argument is NFC and the result contains fullwidth A followed by precomposed accented e. The plain NFC control gives the same successful result throughout. We record acceptance, output and code points. Unlike an earlier guide comparing normalization with direct marker removal from content, this test keeps the normalized content fixed and varies the option supplied by the caller. It therefore asks a different configuration question.
Wrong case survives cleaning while another valid form changes output
The lowercase nfc control contains no selected invisible code point and continues throwing RangeError after cleanup. Removing hidden characters does not capitalize an option or map it to an intended enumeration value. NFKC is accepted and returns ASCII A followed by the same accented e, demonstrating a compatibility change absent from the NFC result in this sample. Both accepted calls return strings, but their first code points differ. That is why automatically switching to another valid form merely to avoid an exception can change visible content. The experiment measures two valid forms and two malformed spellings, not the entire normalization algorithm, every combining order or every compatibility mapping. No claim is made that normalization detects source authorship.
Validate configuration independently from text cleanup
If an application accepts a normalization form from a user or configuration file, enforce its allowed spellings explicitly and choose the intended normalization policy before operating on content. Retain the original input and a known comparison sample when diagnosing exceptions. A successful call with a different form is not proof that it preserves the same representation requirements. Our callback repairs the authored interruption, while the independent destination operation demonstrates what the selected option subsequently does. The downloadable script contains the fixed sample, exact arguments and error names, allowing the same narrow check in another runtime. It does not recommend compatibility normalization for every document, promise preservation of all typography, or establish removal of a model-level statistical watermark.
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
ECMAScript normalize 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.