🌐
Unicode
unicode.org › reports › tr15
UAX #15: Unicode Normalization Forms
July 30, 2025 - Essentially, the Unicode Normalization Algorithm puts all combining marks in a specified order, and uses rules for decomposition and composition to transform each string into one of the Unicode Normalization Forms.
🌐
Microsoft Learn
learn.microsoft.com › en-us › windows › win32 › intl › using-unicode-normalization-to-represent-strings
Using Unicode Normalization to Represent Strings - Win32 apps | Microsoft Learn
January 7, 2021 - In response to this requirement, the Unicode Consortium has defined a process called "normalization," which produces one binary representation for any of the equivalent binary representations of a character.
aspect of the Unicode Standard
Unicode equivalence is the specification by the Unicode character encoding standard that some sequences of code points represent essentially the same character. The feature was introduced in the standard to allow compatibility … Wikipedia
🌐
Wikipedia
en.wikipedia.org › wiki › Unicode_equivalence
Unicode equivalence - Wikipedia
April 13, 2026 - The standard also defines a text normalization procedure, called Unicode normalization, which replaces equivalent sequences of characters so that any two texts that are equivalent will be reduced to the same sequence of code points, called the normalization form or normal form of the original text.
🌐
Unicode
unicode.org › faq › normalization.html
FAQ - Normalization
September 12, 2019 - Unicode encodes some text elements ... canonically equivalent. Normalizing a string essentially means consistently picking one of these equivalent encodings, that is, either all composed or all decomposed....
🌐
DenCode
dencode.com › en › string › unicode-normalization
Unicode Normalization (NFC, NFKC, NFD, NFKD) Converter Online - DenCode
Unicode normalization is the decomposition and composition of characters. Some Unicode characters have the same appearance but multiple representations. For example, "â" can be represented as one code point for "â" (U+00E2), and two decomposed ...
🌐
Unicode
unicode-org.github.io › icu › userguide › transforms › normalization
Normalization | ICU Documentation
Normalization allows for easier sorting and searching of text. The ICU normalization APIs support the standard normalization forms which are described in great detail in Unicode Technical Report #15 (Unicode Normalization Forms) and the Normalization, Sorting and Searching sections of chapter ...
🌐
Medium
medium.com › data-science › what-on-earth-is-unicode-normalization-56c005c55ad0
What on Earth is Unicode Normalization? | TDS Archive
September 2, 2021 - Unicode normalization and its four forms (NFD, NFC, NFKD, and NFKC) is the best method for normalizing all of the different Unicode characters on the web.
Find elsewhere
🌐
Sjorek
sjorek.github.io › unicode-normalization
Unicode-Normalization | unicode-normalization
<?php /** * Class for normalizing unicode. * * “Normalization: A process of removing alternate representations of equivalent * sequences from textual data, to convert the data into a form that can be * binary-compared for equivalence.
🌐
GitHub
github.com › unicode-rs › unicode-normalization
GitHub - unicode-rs/unicode-normalization: Unicode Normalization forms according to UAX#15 rules · GitHub
extern crate unicode_normalization; use unicode_normalization::char::compose; use unicode_normalization::UnicodeNormalization; fn main() { assert_eq!(compose('A','\u{30a}'), Some('Å')); let s = "ÅΩ"; let c = s.nfc().collect::<String>(); assert_eq!(c, "ÅΩ"); }
Starred by 196 users
Forked by 46 users
Languages   Rust 99.5% | Python 0.5%
🌐
Kovertiz
kovertiz.com › home › developer tools › unicode normalizer
Unicode Text Normalizer | NFC, NFD, NFKC, NFKD Online
Normalize Unicode text online with kovertiz. Convert strings to NFC, NFD, NFKC, or NFKD standards instantly. Essential for database consistency and web development.
Top answer
1 of 3
15

The FAQ is somewhat misleading, starting from its use of “should” followed by the inconsistent use of “requirement” about the same thing. The Unicode Standard itself (cited in the FAQ) is more accurate. Basically, you should not expect programs to treat canonically equivalent strings as different, but neither should you expect all programs to treat them as identical.

In practice, it really depends on what your software needs to do. In most situations, you don’t need to normalize at all, and normalization may destroy essential information in the data.

For example, U+0387 GREEK ANO TELEIA (·) is defined as canonical equivalent to U+00B7 MIDDLE DOT (·). This was a mistake, as the characters are really distinct and should be rendered differently and treated differently in processing. But it’s too late to change that, since this part of Unicode has been carved into stone. Consequently, if you convert data to NFC or otherwise discard differences between canonically equivalent strings, you risk getting wrong characters.

There are risks that you take by not normalizing. For example, the letter “ä” can appear as a single Unicode character U+00E4 LATIN SMALL LETTER A WITH DIAERESIS or as two Unicode characters U+0061 LATIN SMALL LETTER A U+0308 COMBINING DIAERESIS. It will mostly be the former, i.e. the precomposed form, but if it is the latter and your code tests for data containing “ä”, using the precomposed form only, then it will not detect the latter. But in many cases, you don’t do such things but simply store the data, concatenate strings, print them, etc. Then there is a risk that the two representations result in somewhat different renderings.

It also matters whether your software passes character data to other software somehow. The recipient might expect, due to naive implicit assumptions or consciously and in a documented manner, that its input is normalized.

2 of 3
9
  1. NFC is the general common sense form that you should use, ä is 1 code point there and that makes sense.

  2. NFD is good for certain internal processing - if you want to make accent-insensitive searches or sorting, having your string in NFD makes it much easier and faster. Another usage is making more robust slug titles. These are just the most obvious ones, I am sure there are plenty of more uses.

  3. If two strings x and y are canonical equivalents, then
    toNFC(x) = toNFC(y)
    toNFD(x) = toNFD(y)

    Is that what you meant?

🌐
Minaret
minaret.info › test › normalize.msp
Unicode Normalization Test Page
This page provides a means to normalize a string of Unicode characters using the Java language version ("icu4j") of the IBM International Components for Unicode (ICU) library.
🌐
Medium
medium.com › concerning-pharo › an-implementation-of-unicode-normalization-7c6719068f43
An Implementation of Unicode Normalization | by Sven VC | Concerning Pharo | Medium
February 18, 2016 - An additional difficulty is that the normalized ordering of multiple consecutive combining marks must be defined. This is done using a concept called the Canonical Combining Class or CCC, a Unicode character property.
🌐
Dietcode
dietcode.io › p › unicode-normalization
Unicode normalization - Dietcode
For example, "ü" == "ü" will always yield `false“, because one of them has a diacritic (umlauts are a diacritic, a language term for “modifier”), and the other doesn’t. Because such characters can be represented in two different ways, we came up with conventions about how to represent them, and this is where normalization comes from. One such convention is called NFC. Here, we always represent such characters as a single unicode character, so “u followed by umlaut” gets converted to “u with umlaut”, and the other one stays the same.
🌐
Microsoft Learn
learn.microsoft.com › en-us › dotnet › api › system.string.normalize
String.Normalize Method (System) | Microsoft Learn
The Unicode standard defines a process called normalization that returns one binary representation when given any of the equivalent binary representations of a character. Normalization can be performed with several algorithms, called normalization ...
🌐
With Blue Ink
withblue.ink › 2019 › 03 › 11 › why-you-need-to-normalize-unicode-strings.html
When "Zoë" !== "Zoë". Or why you need to normalize Unicode strings | With Blue Ink
March 11, 2019 - The problem is that 128 characters ... was to adopt a standard called Unicode, aiming to include every single character of every modern and historic script, plus a variety of symbols....
🌐
GitHub
github.com › sjorek › unicode-normalization
GitHub - sjorek/unicode-normalization: An enhanced facade to existing unicode-normalization implementations. · GitHub
<?php /** * Class for normalizing unicode. * * “Normalization: A process of removing alternate representations of equivalent * sequences from textual data, to convert the data into a form that can be * binary-compared for equivalence.
Author   sjorek
🌐
Rust
docs.rs › unicode-normalization
unicode_normalization - Rust
extern crate unicode_normalization; use unicode_normalization::char::compose; use unicode_normalization::UnicodeNormalization; fn main() { assert_eq!(compose('A','\u{30a}'), Some('Å')); let s = "ÅΩ"; let c = s.nfc().collect::<String>(); assert_eq!(c, "ÅΩ"); }