JavaScript für ungeduldige Programmierer (ES2022-Ausgabe)
Bitte unterstützen Sie dieses Buch: kaufen Sie es oder spenden Sie
(Werbung, bitte nicht blockieren.)

19 Unicode – eine kurze Einführung (fortgeschritten)



Unicode ist ein Standard zur Darstellung und Verwaltung von Text in den meisten Schriftsystemen der Welt. Fast jede moderne Software, die mit Text arbeitet, unterstützt Unicode. Der Standard wird vom Unicode Consortium gepflegt. Jedes Jahr wird eine neue Version des Standards veröffentlicht (mit neuen Emojis usw.). Unicode Version 1.0.0 wurde im Oktober 1991 veröffentlicht.

19.1 Code-Punkte vs. Code-Einheiten

Zwei Konzepte sind entscheidend für das Verständnis von Unicode

19.1.1 Code-Punkte

Die erste Version von Unicode hatte 16-Bit-Code-Punkte. Seitdem ist die Anzahl der Zeichen erheblich gewachsen und die Größe der Code-Punkte wurde auf 21 Bit erweitert. Diese 21 Bit sind in 17 Ebenen unterteilt, jeweils mit 16 Bit

Die Ebenen 1–16 werden als ergänzende Ebenen oder astrale Ebenen bezeichnet.

Überprüfen wir die Code-Punkte einiger Zeichen

> 'A'.codePointAt(0).toString(16)
'41'
> 'ü'.codePointAt(0).toString(16)
'fc'
> 'π'.codePointAt(0).toString(16)
'3c0'
> '🙂'.codePointAt(0).toString(16)
'1f642'

Die hexadezimalen Zahlen der Code-Punkte zeigen, dass die ersten drei Zeichen in Ebene 0 (innerhalb von 16 Bit) liegen, während das Emoji in Ebene 1 liegt.

19.1.2 Kodierung von Unicode-Code-Punkten: UTF-32, UTF-16, UTF-8

Die Hauptmethoden zur Kodierung von Code-Punkten sind drei Unicode Transformation Formats (UTFs): UTF-32, UTF-16, UTF-8. Die Zahl am Ende jedes Formats gibt die Größe (in Bit) seiner Code-Einheiten an.

19.1.2.1 UTF-32 (Unicode Transformation Format 32)

UTF-32 verwendet 32 Bit zum Speichern von Code-Einheiten, was zu einer Code-Einheit pro Code-Punkt führt. Dieses Format ist das einzige mit Festlängen-Kodierung; alle anderen verwenden eine variable Anzahl von Code-Einheiten, um einen einzelnen Code-Punkt zu kodieren.

19.1.2.2 UTF-16 (Unicode Transformation Format 16)

UTF-16 verwendet 16-Bit-Code-Einheiten. Es kodiert Code-Punkte wie folgt

Anders ausgedrückt, die beiden hexadezimalen Ziffern am Ende tragen 8 Bit bei. Aber wir können diese 8 Bit nur verwenden, wenn eine BMP mit einem der folgenden 2-stelligen Paare beginnt

Pro Surrogat haben wir eine Auswahl zwischen 4 Paaren, was den Ursprung der verbleibenden 2 Bit erklärt.

Infolgedessen ist jede UTF-16-Code-Einheit immer entweder ein führendes Surrogat, ein nachfolgendes Surrogat oder kodiert einen BMP-Code-Punkt.

Dies sind zwei Beispiele für UTF-16-kodierte Code-Punkte

19.1.2.3 UTF-8 (Unicode Transformation Format 8)

UTF-8 hat 8-Bit-Code-Einheiten. Es verwendet 1–4 Code-Einheiten, um einen Code-Punkt zu kodieren

Code-Punkte Code-Einheiten
0000–007F 0bbbbbbb (7 Bit)
0080–07FF 110bbbbb, 10bbbbbb (5+6 Bit)
0800–FFFF 1110bbbb, 10bbbbbb, 10bbbbbb (4+6+6 Bit)
10000–1FFFFF 11110bbb, 10bbbbbb, 10bbbbbb, 10bbbbbb (3+6+6+6 Bit)

Hinweise

Drei Beispiele

Zeichen Code-Punkt Code-Einheiten
A 0x0041 01000001
π 0x03C0 11001111, 10000000
🙂 0x1F642 11110000, 10011111, 10011001, 10000010

19.2 In der Webentwicklung verwendete Kodierungen: UTF-16 und UTF-8

Die in der Webentwicklung verwendeten Unicode-Kodierungsformate sind: UTF-16 und UTF-8.

19.2.1 Quellcode intern: UTF-16

Die ECMAScript-Spezifikation stellt den Quellcode intern als UTF-16 dar.

19.2.2 Strings: UTF-16

Die Zeichen in JavaScript-Strings basieren auf UTF-16-Code-Einheiten

> const smiley = '🙂';
> smiley.length
2
> smiley === '\uD83D\uDE42' // code units
true

Weitere Informationen zu Unicode und Strings finden Sie in §20.7 „Atome von Text: Code-Punkte, JavaScript-Zeichen, Grapheme-Cluster“.

19.2.3 Quellcode in Dateien: UTF-8

HTML und JavaScript werden heutzutage fast immer als UTF-8 kodiert.

Zum Beispiel beginnen HTML-Dateien heute normalerweise so

<!doctype html>
<html>
<head>
  <meta charset="UTF-8">
···

Für HTML-Module, die in Webbrowsern geladen werden, ist die Standardkodierung ebenfalls UTF-8.

19.3 Grapheme-Cluster – die eigentlichen Zeichen

Das Konzept eines Zeichens wird bemerkenswert komplex, wenn wir die verschiedenen Schriftsysteme der Welt berücksichtigen. Deshalb gibt es mehrere verschiedene Unicode-Begriffe, die alle in irgendeiner Weise „Zeichen“ bedeuten: Code-Punkt, Grapheme-Cluster, Glyphe usw.

In Unicode ist ein Code-Punkt ein atomarer Bestandteil von Text.

Ein Grapheme-Cluster entspricht jedoch am ehesten einem Symbol, das auf dem Bildschirm oder Papier angezeigt wird. Er ist definiert als „eine horizontal segmentierbare Texteinheit“. Daher bezeichnen offizielle Unicode-Dokumente ihn auch als benutzerwahrgenommenes Zeichen. Ein oder mehrere Code-Punkte sind erforderlich, um einen Grapheme-Cluster zu kodieren.

Zum Beispiel wird das Devanagari-kshi durch 4 Code-Punkte kodiert. Wir verwenden Array.from(), um einen String in ein Array mit Code-Punkten aufzuteilen (Einzelheiten finden Sie in §20.7.1 „Arbeiten mit Code-Punkten“)

Splitting the grapheme cluster for the Devanagari _kshi_ into code points.

Flaggen-Emojis sind ebenfalls Grapheme-Cluster und bestehen aus zwei Code-Punkten – zum Beispiel die Flagge Japans

Splitting a flag emoji into code points.

19.3.1 Grapheme-Cluster vs. Glyphen

Ein Symbol ist ein abstraktes Konzept und Teil der Schriftsprache

Die Unterscheidung zwischen einem Konzept und seiner Darstellung ist subtil und kann verschwimmen, wenn man über Unicode spricht.

  Mehr Informationen zu Grapheme-Clustern

Für weitere Informationen siehe „Let’s Stop Ascribing Meaning to Code Points“ von Manish Goregaokar.

  Quiz

Siehe Quiz-App.