Skip to main content

Unicode Text Normalizer

Compare pasted text across all four Unicode normalization forms (NFC, NFD, NFKC, NFKD) — see the code points and UTF-8 byte length of each, and which form the input already matches. Catches the composed-vs-decomposed bugs that break string/database key comparisons.

Input

Output

Which normalization form(s) the input is already in, before any conversion.

Normalization Forms Compared
FormNormalized TextCode PointsUTF-8 BytesSame as Input?
No data yet
Was this helpful?

Guides

What does this tool do?

It takes any text and shows you exactly how it looks under each of the four Unicode normalization forms — NFC, NFD, NFKC, and NFKD — side by side: the normalized text, its code points in U+XXXX notation, its UTF-8 byte length, and whether that form matches your original input byte-for-byte. It also tells you which form (if any) your pasted text is already in.

Why normalization forms matter

Some characters can be represented two different ways in Unicode. An accented letter like é can be a single precomposed code point (U+00E9), or a plain e (U+0065) followed by a combining acute accent (U+0301). Both render identically on screen, but they are different sequences of bytes — so "café" === "café" can silently return false if one string came from a form that composes accents and the other from a form (like macOS's HFS+ filenames, or some IME/OCR pipelines) that decomposes them. The same applies to compatibility characters: a ligature like (U+FB01) is a single code point that looks like f + i, but only the K forms (NFKC/NFKD) treat it as equivalent to the two-letter sequence.

  • NFC (Canonical Composition) — combines characters into their precomposed form wherever possible. The most common form on the web and in most databases.
  • NFD (Canonical Decomposition) — splits precomposed characters into a base character plus combining marks.
  • NFKC / NFKD — the same composition/decomposition, but also fold in "compatibility" equivalences (ligatures, fullwidth forms, superscripts) that NFC/NFD leave alone. Lossy for formatting, but useful for search/matching.

How to use it

Paste or type any text. The tool immediately shows which normalization form(s) your input already matches, then a table with all four forms — their normalized text, code points, and UTF-8 byte length — so you can see precisely which characters change (and by how many bytes) under each transformation.

Common uses

  • Debugging string-comparison or lookup bugs caused by mismatched composed/decomposed forms (a classic pain point comparing filenames or user input against a database)
  • Deciding which normalization form to apply before storing, hashing, or indexing user-submitted text
  • Understanding why a search doesn't match text that looks identical on screen
  • Checking whether an accented or ligature-heavy string will change size when normalized (affects fixed-length fields, hashes, or byte-length checks)

Related tools

Privacy

This tool runs entirely in your browser using the built-in String.prototype.normalize() API. Your text is never uploaded to a server.

nfcnfdnfkcnfkddiacriticsaccented characterscombining markscanonical equivalencecompose decomposestring comparison bug

More ways to use this tool

REST API

curl -X POST https://api.iotools.cloud/v1/tool/unicode-text-normalizer \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "inputText": "Café"
  }'

Swap in your own key from your account. The tool's fields are the body — no wrapper.

Ask an AI agent

Use the IOTools `unicode-text-normalizer` tool (Unicode Text Normalizer) on this input:

YOUR_INPUT_HERE

Paste this at any agent connected to the IOTools MCP server, then add your input.

Embed widget

<iframe
  src="https://iotools.cloud/embed/unicode-text-normalizer/"
  width="100%" height="520" frameborder="0" scrolling="no" loading="lazy"
  title="Unicode Text Normalizer — iotools.cloud"
  sandbox="allow-scripts allow-forms allow-same-origin allow-downloads allow-popups allow-popups-to-escape-sandbox"
  allow="clipboard-write"
  style="width:100%;border:1px solid #e5e7eb;border-radius:12px;overflow:hidden"></iframe>
<script src="https://iotools.cloud/embed.js" async></script>

Drop this into your own page — free, no key required, just a link back.

Cost per callFrom 5 credits

Also available with

Love the tools? Lose the ads.

One payment clears every ad from your account, for good. No subscription, no tracking.