Normalize Unicode text and expose what you cannot see
Two strings can look identical and still be different: “é” may be one code point (U+00E9) or two (e + U+0301), a URL may contain a Cyrillic “а”, and pasted text often carries zero-width spaces, byte-order marks and no-break spaces. This Unicode normalizer converts text to any of the four Unicode normalization forms — NFC, NFD, NFKC and NFKD — and cleans it up: remove invisible and zero-width characters (listed by name and count), turn unusual spaces into normal ones, strip diacritics, replace look-alike letters and smart punctuation with ASCII, and lowercase, uppercase or case-fold.
It also explains what is in the text. Findings flag bidirectional override characters (the “Trojan Source” and fake-file-extension trick), homoglyphs from Cyrillic, Greek, Armenian and Cherokee, mixed-script words such as a spoofed “paypаl”, compatibility characters and whether the text is already normalized. A code point table shows every character before and after with its U+ code and UTF-8 bytes, and a size table compares grapheme, code point, UTF-16 and UTF-8 counts.
Normalization uses your browser’s own Unicode implementation, so the result matches what JavaScript, and most databases and languages, produce. Nothing is uploaded.
How to use the Unicode Normalizer
- Paste text into Text, or load the sample, which hides several problems on purpose.
- Choose a Normalization form: NFC for storage and the web, NFKC for identifiers, usernames and search keys.
- Tick the clean-ups you want: invisible characters, unusual spaces, diacritics, look-alikes, smart quotes and dashes, and a case option.
- Read the Findings for invisible, bidirectional and confusable characters and mixed-script words.
- Compare Size and length and the Code points table before and after, then press Copy result.
Unicode Normalizer features
All four normalization forms
Canonical (NFC/NFD) and compatibility (NFKC/NFKD) composition and decomposition via the browser’s Unicode tables (Unicode 15+ in current browsers).
Invisible-character remover
Zero-width spaces and joiners, BOM, word joiner, soft hyphen, direction marks, embeddings, overrides and isolates, Hangul fillers and tag characters are removed and listed — while joiners inside emoji sequences such as 👨👩👧 can be kept.
Homoglyph detector
A table of common confusables (from Unicode’s confusables data) catches Cyrillic, Greek, Armenian and other letters that look Latin, flags mixed-script words and shows their ASCII “skeleton”.
Diacritics and case
Accents are stripped by decomposing and dropping combining marks, plus ø, ł, đ, ħ and ŧ. Case folding maps ß to ss and final sigma to σ, making case-insensitive comparisons reliable.
Byte and length counts
Graphemes (what users see as characters), code points, UTF-16 code units (JavaScript length) and UTF-8 bytes, which is what database column limits and APIs usually count.
NFC, NFD, NFKC and NFKD compared
| Form | What it does | “é” | “fi” | Use it for |
|---|---|---|---|---|
| NFC | Canonical decomposition, then composition | U+00E9 | fi (unchanged) | Storing and exchanging text; the W3C recommends NFC on the web |
| NFD | Canonical decomposition | U+0065 U+0301 | fi (unchanged) | Processing accents separately; older macOS file names |
| NFKC | Compatibility decomposition, then composition | U+00E9 | f i | Usernames, identifiers, search indexes (as in Unicode UAX #31 and PRECIS) |
| NFKD | Compatibility decomposition | U+0065 U+0301 | f i | Fuzzy matching and transliteration pipelines |
Why invisible and look-alike characters matter
- Security: a domain or username written with a Cyrillic “а” is a different string that looks the same — the IDN homograph attack. A right-to-left override (U+202E) inserted in “invoice[U+202E]fdp.exe” makes the name display as “invoiceexe.pdf”.
- Bugs: a zero-width space copied from a web page breaks string comparisons, JSON keys, CSV headers and passwords; a BOM at the start of a file confuses parsers.
- Search and deduplication: “Café” in NFC and NFD are unequal byte-for-byte; normalize before indexing or comparing.
- Length limits: an emoji family is one grapheme but eight code points, eleven UTF-16 units and 18 UTF-8 bytes — the counts here show which one your system enforces. See also the Character Counter.
Related tools
To insert an invisible character deliberately, use the Invisible Character tool; to see escape sequences for any character, the Text to Unicode converter; for general clean-up such as extra spaces and line breaks, the Text Cleaner; and to percent-encode normalized text for URLs, the URL Encoder.
Unicode Normalizer FAQ
What is Unicode normalization?
Unicode often has more than one way to encode the same visible text, such as a precomposed “é” or “e” plus a combining accent. Normalization converts text to a single, standard representation (one of NFC, NFD, NFKC or NFKD, defined in Unicode Standard Annex #15) so that equal-looking strings compare equal.
Which form should I use: NFC or NFKC?
Use NFC for almost everything you store or display — it never changes how text looks. Use NFKC when you need a stricter identity, such as usernames or search keys, because it also folds ligatures, full-width forms and superscripts, which changes appearance.
How do I remove zero-width characters from text?
Paste the text into the Unicode normalizer with “Remove zero-width / invisible characters” ticked. The findings list every removed character by code point and name. Leave “Keep joiners inside emoji” on so multi-person and flag emoji stay intact.
How does the homoglyph detector work?
It checks each character against a list of letters that are visually confusable with ASCII, drawn from Unicode’s confusables data, and flags words mixing Latin with another script. It covers the common cases used in spoofing, not every confusable pair in Unicode.
Does stripping diacritics work for every language?
It removes combining marks after decomposition, which handles Latin, Greek and many other scripts, and maps a few letters without decompositions (ø, ł, đ, ħ, ŧ). It does not transliterate scripts such as Cyrillic or Chinese into Latin.
Is case folding the same as lowercasing?
Mostly, but not quite. Case folding is designed for comparisons: “ß” becomes “ss” and the final sigma “ς” becomes “σ”. Lowercasing keeps “ß” and “ς” as they are.