By Docify

NFC vs NFD vs NFKC: Canonical vs Compatibility

• 6 min read

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.

e + U+0301 → é (U+00E9) · NFC normalization

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

é → e + U+0301 · NFD output

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

fi (U+FB01) → fi · NFKC output

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