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.
Zwei Konzepte sind entscheidend für das Verständnis von Unicode
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.
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.
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.
UTF-16 verwendet 16-Bit-Code-Einheiten. Es kodiert Code-Punkte wie folgt
Die BMP (erste 16 Bit von Unicode) wird in einzelnen Code-Einheiten gespeichert.
Astrale Ebenen: Die BMP umfasst 0x10_000 Code-Punkte. Da Unicode insgesamt 0x110_000 Code-Punkte hat, müssen wir die verbleibenden 0x100_000 Code-Punkte (20 Bit) kodieren. Die BMP hat zwei Bereiche nicht zugewiesener Code-Punkte, die den notwendigen Speicherplatz bieten
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
🙂) befindet sich in einer astralen Ebene und wird durch zwei Code-Einheiten dargestellt: 0xD83D und 0xDE42.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 |
Die in der Webentwicklung verwendeten Unicode-Kodierungsformate sind: UTF-16 und UTF-8.
Die ECMAScript-Spezifikation stellt den Quellcode intern als UTF-16 dar.
Die Zeichen in JavaScript-Strings basieren auf UTF-16-Code-Einheiten
> const smiley = '🙂';
> smiley.length
2
> smiley === '\uD83D\uDE42' // code units
trueWeitere Informationen zu Unicode und Strings finden Sie in §20.7 „Atome von Text: Code-Punkte, JavaScript-Zeichen, Grapheme-Cluster“.
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.
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“)
Flaggen-Emojis sind ebenfalls Grapheme-Cluster und bestehen aus zwei Code-Punkten – zum Beispiel die Flagge Japans
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.