Text run is not in Unicode Normalization Form C

Unicode und die Normalform C für UTF-8-kodierte Zeichen

Bei bestimmten Zeichen, die utf-8-kodiert oder als numerische Codereferenz (NCR) in einer HTML-Seite eingebaut sind, gibt der W3.org-Validator eine Warnung aus: Text run is not in Unicode Normalization Form C. Zum Beispiel wenn das Unicode-Zeichen OHM SIGN, Codepoint 0x2126 als NCR Ω in die Seite eingebaut wurde. Nun, es gibt 4 Normalformen:

Die kanonische Dekomposition (NFD), die kanonische Dekomposition gefolgt von einer kanonischen Komposition (NFC), die kompatible Dekomposition (NFKD) und die kompatible Dekomposition gefolgt von einer kanonischen Komposition (NFKC).Normalisierung (Wikipedia)

Dazu lesen wir auf Unicode.org:

For loose matching, programs may want to use the normalization forms NFKC and NFKD, which remove compatibility distinctions. These two latter normalization forms, however, do lose information and are thus most appropriate for a restricted domain such as identifiers.
(Für einen losen Abgleich möchten Programme möglicherweise die Normalisierungsformulare NFKC und NFKD verwenden, um Kompatibilitätsunterschiede zu beseitigen. Diese beiden letzteren Normalisierungsformen verlieren jedoch Informationen und sind daher für eine eingeschränkte Domäne wie Identifikatoren am besten geeignet).

Mit dem Perl-Modul Unicode::Normalize ist es recht einfach diese Empfehlung umzusetzen, bspw. also auf die Normalfom zu prüfen:

use Unicode::Normalize qw(normalize);
my $char = pack "U", 0x2126; # OHM SIGN
printf "%04X", unpack("U", normalize('NFC', $char)); # 03A9

Die Funktion normalize() liefert also den Codepoint für das Zeichen in der Normalform C. Beide Zeichen nebeneinander sehen gleich aus, sind jedoch unterschiedliche Zeichen:

Einzelzeichen Codepoint (hex) Codepoint (dec) UTF-8 Oktetten Unicode Name
2126 8486 E2 84 A6 OHM SIGN
Ω 3A9 937 CE A9 GREEK CAPITAL LETTER OMEGA

Eine Auswahl über die Normalform C

Untenstehende Tabelle zeigt eine Auswahl von Zeichen und deren Normalform C für die Codepoints von 128..10000 (dezimal):

Zeichen ̀ Codepoint U+340 Zeichen NFC ̀ Codepoint NFC U+300
Zeichen ́ Codepoint U+341 Zeichen NFC ́ Codepoint NFC U+301
Zeichen ̓ Codepoint U+343 Zeichen NFC ̓ Codepoint NFC U+313
Zeichen ̈́ Codepoint U+344 Zeichen NFC ̈ Codepoint NFC U+308
Zeichen ʹ Codepoint U+374 Zeichen NFC ʹ Codepoint NFC U+2B9
Zeichen ; Codepoint U+37E Zeichen NFC ; Codepoint NFC U+3B
Zeichen · Codepoint U+387 Zeichen NFC · Codepoint NFC U+B7
Zeichen Codepoint U+958 Zeichen NFC Codepoint NFC U+915
Zeichen Codepoint U+959 Zeichen NFC Codepoint NFC U+916
Zeichen Codepoint U+95A Zeichen NFC Codepoint NFC U+917
Zeichen Codepoint U+95B Zeichen NFC Codepoint NFC U+91C
Zeichen Codepoint U+95C Zeichen NFC Codepoint NFC U+921
Zeichen Codepoint U+95D Zeichen NFC Codepoint NFC U+922
Zeichen Codepoint U+95E Zeichen NFC Codepoint NFC U+92B
Zeichen Codepoint U+95F Zeichen NFC Codepoint NFC U+92F
Zeichen Codepoint U+9DC Zeichen NFC Codepoint NFC U+9A1
Zeichen Codepoint U+9DD Zeichen NFC Codepoint NFC U+9A2
Zeichen Codepoint U+9DF Zeichen NFC Codepoint NFC U+9AF
Zeichen Codepoint U+A33 Zeichen NFC Codepoint NFC U+A32
Zeichen Codepoint U+A36 Zeichen NFC Codepoint NFC U+A38
Zeichen Codepoint U+A59 Zeichen NFC Codepoint NFC U+A16
Zeichen Codepoint U+A5A Zeichen NFC Codepoint NFC U+A17
Zeichen Codepoint U+A5B Zeichen NFC Codepoint NFC U+A1C
Zeichen Codepoint U+A5E Zeichen NFC Codepoint NFC U+A2B
Zeichen Codepoint U+B5C Zeichen NFC Codepoint NFC U+B21
Zeichen Codepoint U+B5D Zeichen NFC Codepoint NFC U+B22
Zeichen Codepoint U+F43 Zeichen NFC Codepoint NFC U+F42
Zeichen Codepoint U+F4D Zeichen NFC Codepoint NFC U+F4C
Zeichen Codepoint U+F52 Zeichen NFC Codepoint NFC U+F51
Zeichen Codepoint U+F57 Zeichen NFC Codepoint NFC U+F56
Zeichen Codepoint U+F5C Zeichen NFC Codepoint NFC U+F5B
Zeichen Codepoint U+F69 Zeichen NFC Codepoint NFC U+F40
Zeichen Codepoint U+F73 Zeichen NFC Codepoint NFC U+F71
Zeichen Codepoint U+F75 Zeichen NFC Codepoint NFC U+F71
Zeichen Codepoint U+F76 Zeichen NFC Codepoint NFC U+FB2
Zeichen Codepoint U+F78 Zeichen NFC Codepoint NFC U+FB3
Zeichen Codepoint U+F81 Zeichen NFC Codepoint NFC U+F71
Zeichen Codepoint U+F93 Zeichen NFC Codepoint NFC U+F92
Zeichen Codepoint U+F9D Zeichen NFC Codepoint NFC U+F9C
Zeichen Codepoint U+FA2 Zeichen NFC Codepoint NFC U+FA1
Zeichen Codepoint U+FA7 Zeichen NFC Codepoint NFC U+FA6
Zeichen Codepoint U+FAC Zeichen NFC Codepoint NFC U+FAB
Zeichen Codepoint U+FB9 Zeichen NFC Codepoint NFC U+F90
Zeichen Codepoint U+1F71 Zeichen NFC ά Codepoint NFC U+3AC
Zeichen Codepoint U+1F73 Zeichen NFC έ Codepoint NFC U+3AD
Zeichen Codepoint U+1F75 Zeichen NFC ή Codepoint NFC U+3AE
Zeichen Codepoint U+1F77 Zeichen NFC ί Codepoint NFC U+3AF
Zeichen Codepoint U+1F79 Zeichen NFC ό Codepoint NFC U+3CC
Zeichen Codepoint U+1F7B Zeichen NFC ύ Codepoint NFC U+3CD
Zeichen Codepoint U+1F7D Zeichen NFC ώ Codepoint NFC U+3CE
Zeichen Codepoint U+1FBB Zeichen NFC Ά Codepoint NFC U+386
Zeichen Codepoint U+1FBE Zeichen NFC ι Codepoint NFC U+3B9
Zeichen Codepoint U+1FC9 Zeichen NFC Έ Codepoint NFC U+388
Zeichen Codepoint U+1FCB Zeichen NFC Ή Codepoint NFC U+389
Zeichen Codepoint U+1FD3 Zeichen NFC ΐ Codepoint NFC U+390
Zeichen Codepoint U+1FDB Zeichen NFC Ί Codepoint NFC U+38A
Zeichen Codepoint U+1FE3 Zeichen NFC ΰ Codepoint NFC U+3B0
Zeichen Codepoint U+1FEB Zeichen NFC Ύ Codepoint NFC U+38E
Zeichen Codepoint U+1FEE Zeichen NFC ΅ Codepoint NFC U+385
Zeichen Codepoint U+1FEF Zeichen NFC ` Codepoint NFC U+60
Zeichen Codepoint U+1FF9 Zeichen NFC Ό Codepoint NFC U+38C
Zeichen Codepoint U+1FFB Zeichen NFC Ώ Codepoint NFC U+38F
Zeichen Codepoint U+1FFD Zeichen NFC ´ Codepoint NFC U+B4
Zeichen   Codepoint U+2000 Zeichen NFC Codepoint NFC U+2002
Zeichen Codepoint U+2001 Zeichen NFC Codepoint NFC U+2003
Zeichen Codepoint U+2126 Zeichen NFC Ω Codepoint NFC U+3A9
Zeichen Codepoint U+212A Zeichen NFC K Codepoint NFC U+4B
Zeichen Codepoint U+212B Zeichen NFC Å Codepoint NFC U+C5
Zeichen Codepoint U+2329 Zeichen NFC Codepoint NFC U+3008
Zeichen Codepoint U+232A Zeichen NFC Codepoint NFC U+3009

Datenschutzerklärung: Diese Seite dient rein privaten Zwecken. Auf den für diese Domäne installierten Seiten werden grundsätzlich keine personenbezogenen Daten erhoben. Das Loggen der Zugriffe mit Ihrer Remote Adresse erfolgt beim Provider soweit das technisch erforderlich ist. s​os­@rolf­rost.de.