Dieses Kapitel erklärt die verbesserte Unterstützung für Unicode, die ECMAScript 6 mit sich bringt. Für eine allgemeine Einführung in Unicode lesen Sie Kap. „Unicode und JavaScript“ in „Speaking JavaScript“.
Es gibt drei Bereiche, in denen ECMAScript 6 die Unterstützung für Unicode verbessert hat
\u{···}String.prototype.codePointAt() lesen.String.fromCodePoint() erstellen./u (plus die boolesche Eigenschaft unicode) verbessert die Handhabung von Ersatzpaarungen.Zusätzlich basiert ES6 auf der Unicode-Version 5.1.0, während ES5 auf der Unicode-Version 3.0 basiert.
Es gibt drei parametrisierte Escape-Sequenzen zur Darstellung von Zeichen in JavaScript
\xHH > '\x7A' === 'z'
true
\uHHHH > '\u007A' === 'z'
true
\u{···} > '\u{7A}' === 'z'
true
Unicode-Code-Punkt-Escapes sind neu in ES6. Sie ermöglichen die Angabe von Code-Punkten über 16 Bit hinaus. Wenn Sie das in ECMAScript 5 tun wollten, mussten Sie jeden Code-Punkt als zwei UTF-16-Code-Einheiten (ein Ersatzpaar) kodieren. Diese Code-Einheiten konnten über Unicode-Escapes ausgedrückt werden. Zum Beispiel gibt die folgende Anweisung eine Rakete (Code-Punkt 0x1F680) auf den meisten Konsolen aus
console.log('\uD83D\uDE80');
Mit einem Unicode-Code-Punkt-Escape können Sie Code-Punkte größer als 16 Bit direkt angeben
console.log('\u{1F680}');
Die Escape-Sequenzen können an den folgenden Stellen verwendet werden
\uHHHH |
\u{···} |
\xHH |
|
|---|---|---|---|
| Bezeichner | ✔ | ✔ | |
| Zeichenketten-Literale | ✔ | ✔ | ✔ |
| Template-Literale | ✔ | ✔ | ✔ |
| Reguläre Ausdrucks-Literale | ✔ | Nur mit dem Flag /u |
✔ |
Bezeichner
\uHHHH wird zu einem einzigen Code-Punkt.\u{···} wird zu einem einzigen Code-Punkt.> const hello = 123;
> hell\u{6F}
123
Zeichenketten-Literale
\xHH liefert eine UTF-16-Code-Einheit.\uHHHH liefert eine UTF-16-Code-Einheit.\u{···} liefert die UTF-16-Kodierung seines Code-Punkts (eine oder zwei UTF-16-Code-Einheiten).Template-Literale
> `hell\u{6F}` // cooked
'hello'
> String.raw`hell\u{6F}` // raw
'hell\\u{6F}'
Reguläre Ausdrücke
/u gesetzt ist, da \u{3} andernfalls als dreimal das Zeichen u interpretiert wird > /^\u{3}$/.test('uuu')
true
Verschiedene Informationen
Die Spezifikation unterscheidet zwischen BMP-Mustern (Flag /u nicht gesetzt) und Unicode-Mustern (Flag /u gesetzt). Abschn. „Pattern Semantics“ erklärt, dass sie unterschiedlich behandelt werden und wie.
Zur Erinnerung, hier ist, wie Grammatikregeln in der Spezifikation parametrisiert werden
R den Index [U] hat, bedeutet dies, dass es zwei Versionen davon gibt: R und R_U.[?U] weitergeben.[+U] hat, existiert er nur, wenn der Index [U] vorhanden ist.[~U] hat, existiert er nur, wenn der Index [U] nicht vorhanden ist.Diese Parametrisierung kann man in Abschn. „Patterns“ beobachten, wo der Index [U] separate Grammatiken für BMP-Muster und Unicode-Muster erstellt
\u nicht von vier Hexadezimalziffern gefolgt wird, wird es als u interpretiert). In Unicode-Mustern funktioniert dies nur für die folgenden Zeichen (was \u für Unicode-Code-Punkt-Escapes freigibt): ^ $ \ . * + ? ( ) [ ] { } |"\u{" HexDigits "}" ist nur in Unicode-Mustern erlaubt. In diesen Mustern werden führende und nachfolgende Surrogates ebenfalls gruppiert, um bei der UTF-16-Dekodierung zu helfen.Abschn. „CharacterEscape“ erklärt, wie verschiedene Escape-Sequenzen in Zeichen übersetzt werden (ungefähr: entweder Code-Einheiten oder Code-Punkte).