Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Unicode-Normalisierung (was: Normalisierung? - Was geschieht hierbei? - do not ignore )

0 views
Skip to first unread message

Marcel Logen

unread,
Jul 2, 2023, 10:58:04 AM7/2/23
to
Thomas Barghahn in de.test:

[Unicode]
>Könnten wir vielleicht einmal ein /einfaches Beispiel/ besprechen,
>sodass auch jedem Leser klar wird, was mit einer Normalisierung an-
>gestrebt wird und wozu sie eigentlich notwendig ist?

Als Einstiegspunkt könnte man
<https://www.unicode.org/reports/tr15/#Norm_Forms> nehmen.

Dort etwa das Beispiel mit dem "q" aus Figure 5:
<https://www.unicode.org/reports/tr15/images/UAX15-NormFig5.jpg>.

Wir benötigen auch die aktuelle (Unicode v15) Datei
"UnicodeData.txt":
<https://www.unicode.org/Public/15.0.0/ucd/UnicodeData.txt>.

Ich erzeuge (hier mit Perl) die Unicode-Codepoint-Folge "<U+0071>
<U+0307><U+0323>" mit den Codepoints (aus der UnicodeData.txt)

0071;LATIN SMALL LETTER Q;Ll;0;L;;;;;N;;;0051;;0051
0307;COMBINING DOT ABOVE;Mn;230;NSM;;;;;N;NON-SPACING DOT ABOVE;;;;
0323;COMBINING DOT BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOT BELOW;;;;

| user15@o15:~/ybtra-o15/unicode-tools$ perl -X -e 'print "\N{U+0071}\N{U+0307}\N{U+0323}"' | ./parser-utf-8-1500-nb020.py
| 71 01110001 => q
| CC 11001100 UTF-8: start
| 87 10000111 ... continuation
| CC87 => U+0307 COMBINING DOT ABOVE
| 775 - Block: Combining Diacritical Marks (0300-036F, 768-879)
| CC 11001100 UTF-8: start
| A3 10100011 ... continuation
| CCA3 => U+0323 COMBINING DOT BELOW
| 803 - Block: Combining Diacritical Marks (0300-036F, 768-879)

Dabei zeigt mein Script "parser-utf-8-1500-nb020.py" die
Bytes und Codepoints einzeln an - in der Reihenfolge, wie
sie gesendet wurden, also zuerst das "q", dann den "DOT
ABOVE" und zuletzt den "DOT BELOW".

Mit dem Tool "uconv" kann man die Reihenfolge der Codepoints
nach NFC konvertieren:

| user15@o15:~/ybtra-o15/unicode-tools$ perl -X -e 'print "\N{U+0071}\N{U+0307}\N{U+0323}"' | uconv -x 'any-nfc;' | ./parser-utf-8-1500-nb020.py
| 71 01110001 => q
| CC 11001100 UTF-8: start
| A3 10100011 ... continuation
| CCA3 => U+0323 COMBINING DOT BELOW
| 803 - Block: Combining Diacritical Marks (0300-036F, 768-879)
| CC 11001100 UTF-8: start
| 87 10000111 ... continuation
| CC87 => U+0307 COMBINING DOT ABOVE
| 775 - Block: Combining Diacritical Marks (0300-036F, 768-879)

Jetzt sieht man, daß sich für NFC die Reihenfolge der DOTs
verändert hat.

Wenn man Unicode-Strings byteweise vergleichen möchte, könnte
man dafür also NFC benutzen.

Die oben bei der UnicodeData.txt angegebenen Werte "220" und
"230" sind die sog. "ccc" (canonical combining classes) der
jeweiligen Codepoints. Um zur Normalform D (decomposed) zu ge-
langen, müssen die COMBINING Codepoints so umsortiert werden,
daß die ccc aufsteigend sortiert sind.

<https://www.unicode.org/reports/tr15/#Description_Norm>

(NFKC und NFKD würde ich erst mal nicht weiter beachten.)

tbc ...

Marcel

fup2 de.comp.text.misc
--
╭────╮ ╭─────╮ ╭──╮ ╭─╮ ╭──╮ ..48..╭──────╮ ╭─╮
╯ ╭─╯ ╰───╮ │ ..26..│ ╰─╯ ╰─╯ ╰─╮ ╭─╮ │ ╭───╯ │ ╰─╮ ╭─
╭─╯ ╭───╯ ╰─╮ ╭─╮ ╭─╮ ╭──╯ ..40..╰─╯ │ ╭─╯ ╰────╮ │ ╰─╯
╰──────╯ ╰───╯ ╰─╯ ╰─╯ ╰─╯ ╰──╯ ..67..
0 new messages