NFC vs NFD vs NFKC: Canonical vs Compatibility
UAX #15 Revision 58 (Unicode 18.0.0, 12 August 2026) names four forms. String.prototype.normalize is ECMA-262’s binding. NFC is canonical decomposition then composition. NFD is canonical decomposition. NFKC / NFKD use compatibility mappings. The sample on the live normalizer fills e + U+0301. Compose e + U+0301 to é (U+00E9) on /unicode-normalize/. NFD output of é is e + U+0301. NFKC output of fi (U+FB01) is fi. Canonical NFC does not open that ligature. Singleton Å (U+212B) NFC is Å (U+00C5). Mapping tables are the browser’s. This is not IDNA, not Punycode, and not percent-encoding. IDNA output of NFC é is xn--9ca on /idna/. Punycode output of NFC é is 9ca on /punycode/. Nothing is uploaded.
“Normalize this Unicode” does not name a form. Canonical NFC and NFD keep the same character identity and only change how combining marks are stored. Compatibility NFKC and NFKD also apply mappings that can change identity — a ligature can become two letters. The live Unicode normalizer passes one of those four strings to String.prototype.normalize. This page names that fork. IDNA output of NFC é is xn--9ca on /idna/ because that page runs NFC first. Punycode output of NFC é is 9ca on /punycode/. Those outputs are not a general UAX #15 output.
Four forms, two kinds of mapping
NFC: compose after canonical decompose
UAX #15 Revision 58 defines NFC as canonical decomposition followed by canonical composition. The sample on /unicode-normalize/ fills é (e + U+0301); NFC normalization produces é (U+00E9) as normalized.txt. Official singleton Å NFC is Å. ASCII hello stays hello.
NFD: canonical decompose only
NFD is canonical decomposition with no following composition. The sample fills the precomposed letter é; NFD produces e + U+0301 as normalized.txt. NFD of composed Å is A + U+030A. That ring-A sequence is still NFD — canonical decomposition with no composition — so it stays two code points even though it renders as Å.
NFKC / NFKD: compatibility mappings
The K in NFKC and NFKD stands for compatibility. Those forms apply compatibility Decomposition_Mapping values, then (for NFKC) canonical composition. The NFKC or NFKD sample fills fi (U+FB01); NFKC produces fi (U+0066 U+0069). NFKD produces the same fi. Canonical NFC and NFD leave fi as U+FB01. That is why “looks like fi” is not the same question as “is NFC of fi”.
The browser owns the tables
String.prototype.normalize, not a shipped UCD
Normalize on /unicode-normalize/ is String.prototype.normalize with NFC, NFD, NFKC, or NFKD. That is ECMA-262’s binding of UAX #15 Revision 58 (Unicode 18.0.0, 12 August 2026). The latest /tr15/ pointer now shows Revision 58 — the same dated document this page cites. Mapping tables are the browser’s; the page does not ship a Unicode data file. Download is normalized.txt as text/plain. Click Download to process.
Not a host encoder
IDNA of NFC é produces xn--9ca
UTS #46 ToASCII on /idna/ runs NFC as one host step, then toLowerCase and Punycode with xn--. IDNA output of NFC é is xn--9ca. IDNA output of NFD e + U+0301 is the same xn--9ca. Decode output of xn--9ca is NFC é. Mixed-case XN--9CA is the same NFC é. Encoding Bücher.de writes xn--bcher-kva.de as encoded.txt. RFC 3492 without xn-- on /punycode/ output of NFC é is 9ca. Punycode output of NFD e + U+0301 is e-xbb there because that page never calls String.prototype.normalize. Encoding bücher writes bcher-kva. Percent output of NFC é is %C3%A9 on /url-encoder/; NFD e + U+0301 is e%CC%81. Those outputs are not normalized.txt. This page does not lowercase a host or add xn--.
Normalize NFC, NFD, NFKC, or NFKD in the browser
The sample fills e + U+0301. Normalize output is normalized.txt. Nothing is uploaded.
Use Unicode Normalizer →FAQ
- What is the difference between NFC and NFD?
- NFC composes characters (e + acute becomes e with acute). NFD decomposes them. Both are canonically equivalent.
- When should I use NFKC or NFKD?
- Use compatibility forms for search and comparison. They expand ligatures and width variants.
- Which form should I use for storage?
- NFC is the W3C recommendation for web content and the most interoperable choice.
- Does normalization change my text visually?
- Canonical normalization (NFC/NFD) should not change appearance. Compatibility forms (NFKC/NFKD) may.
Related
- How to Count Words Online: Whitespace Split
- Convert Text to UPPERCASE in the Browser
- UTF-16 vs Locale Sort: Code Units vs localeCompare
- Punycode vs IDNA: RFC 3492 and UTS #46
- WHATWG new URL vs encodeURI: Punycode vs Percent-Encoding
- Minify JSON Without Breaking Unicode
- SHA-256 vs SHA-1 vs MD5: Differences and Which to Use
- Named vs Numeric HTML Entities: Names vs Code Points
- RFC 4648 Base32 vs Base32hex: Alphabet and Sort Order
- Compare Two Texts with diff-match-patch
- Live tool: Unicode NFC / NFD normalizer · Line sorter · Case converter · Word counter · Hash generator · UUID v5 generator · Base64 encoder · IDNA ToASCII · Punycode encoder · URL encoder