Скачать книгу

Maskierungssequenz Maskiertes Zeichen Unicode-Wert \b Rückschritt \u{0008} \t Tabulator \u{0009} \n Zeilenvorschub \u{000A} \r Wagenrücklauf \u{000D} \f Seitenvorschub \u{000C} \v Vertikaler Tabulator \u{000B} \' Einfaches Anführungszeichen \u{0027} \" Doppeltes Anführungszeichen \u{0022} \\ Backslash \u{005C} \Zeilenumbruch Fortsetzung in der nächsten Zeile Nichts – es erfolgt kein Zeilenumbruch:"Hel\lo"ergibt den String "Hello".

      Leider gibt es bei der Verwendung von Unicode in JavaScript einen bösen Haken. Um die Feinheiten zu verstehen, müssen wir einen Blick auf die Geschichte von Unicode werfen. Vor der Erfindung von Unicode gab es verschiedene, nicht miteinander vereinbare Systeme zur Zeichenkodierung, wobei ein und dieselbe Bytefolge für Benutzer in Europa, Russland oder China ganz andere Bedeutungen haben konnte.

      Unicode sollte diese Probleme lösen. Als man in den 80er Jahren mit dieser Vereinheitlichung begann, schien es so, als reiche ein 16-Bit-Code völlig aus, um sämtliche Zeichen in allen Sprachen der Welt zu kodieren und dabei noch Platz für zukünftige Erweiterungen zu lassen. 1991 wurde Unicode 1.0 veröffentlicht, worin knapp die Hälfte der verfügbaren 65.536 Codewerte belegt war. Als JavaScript und Java 1995 erschienen, nutzten sie die Unicode-Kodierung. In beiden Sprachen sind Strings Folgen von 16-Bit-Werten.

      Im Laufe der Zeit aber geschah das Unvermeidliche: Der Umfang von Unicode überstieg den Vorrat von 65.536 Zeichen. Heutzutage nutzt Unicode 21 Bits, was nach gängiger Meinung nun wirklich ausreichen sollte. JavaScript aber ist bei den 16-Bit-Werten stecken geblieben.

      Um zu erklären, wie dieses Problem gelöst wird, müssen wir uns ein bisschen mit dem technischen Hintergrund beschäftigen. Ein Unicode-Codepunkt ist ein 21-Bit-Wert, der mit einem Zeichen verknüpft wird. JavaScript nutzt die UTF-16-Kodierung, die alle Unicode-Codepunkte durch einen oder zwei 16-Bit-Werte oder Codeeinheiten darstellt. Für Zeichen bis \u{FFFF} wird jeweils eine Codeeinheit verwendet. Alle anderen Zeichen dagegen werden mit zwei Einheiten kodiert, die aus einem reservierten Bereich stammen und nicht zur Darstellung irgendwelcher anderer Zeichen genutzt werden. Beispielsweise wird \u{1F310} durch die Folge 0xD83C 0xDF10 kodiert. (Eine Beschreibung des Kodieralgorithmus finden Sie auf https://de.wikipedia.org/wiki/UTF-16.)

      Mit den Einzelheiten der Kodierung müssen Sie sich nicht beschäftigen, aber wissen, dass einige Zeichen eine einzelne 16-Bit-Codeeinheit erfordern, andere dagegen zwei.

      Beispielsweise hat der String 'Hello image' eine Länge von 8, obwohl er nur sieben Unicode-Zeichen enthält (einschließlich des Leerzeichens zwischen Hello und image). Mit dem Operator [] können Sie auf die Codeeinheiten eines Strings zugreifen. Der Ausdruck greeting[0] ist ein String, der nur aus dem Zeichen 'H' besteht. Allerdings funktioniert dieser Operator nicht bei Zeichen, die aus zwei Codeeinheiten aufgebaut sind. Die Codeeinheiten für das Zeichen image befinden sich an den Positionen 6 und 7. Die Ausdrücke greeting[6] und greeting[7] sind Strings der Länge 1 und enthalten jeweils eine einzige Codeeinheit, die aber kein Zeichen kodiert. Mit anderen Worten: Es handelt sich nicht um gültige Unicode-Strings.

image

      Tipp

      In Kapitel 2 werden Sie erfahren, wie Sie mit einer for-of-Schleife die einzelnen Codepunkte abrufen können.

image

       Hinweis

      Sie können in String-Literalen auch 16-Bit-Codeeinheiten angeben, müssen dabei aber die geschweiften Klammern weglassen: \uD83C\uDF10. Für Codeeinheiten bis \u{0xFF} können Sie die Hexmaskierung verwenden, also z. B. \xA0 statt \u{00A0]. Allerdings kann ich mir für beides keinen guten Grund vorstellen.

      In Kapitel 6 lernen Sie die Methoden für die Arbeit mit Strings kennen.

image

       Hinweis

      In JavaScript gibt es auch Literale für reguläre Ausdrücke. Mehr darüber erfahren Sie in Kapitel 6.

       1.11Template-Literale

      Template-Literale sind Strings, die Ausdrücke enthalten und mehrere Zeilen umspannen können. Sie werden in Backticks (`...`) eingeschlossen:

      let destination = 'world' // Regulärer String

      let greeting = `Hello, ${destination.toUpperCase()}!` //Template-Literal

      Die in ${...} eingebetteten Ausdrücke werden ausgewertet, bei Bedarf in einen String umgewandelt und dann in das Template eingefügt. Im vorigen Beispiel ergibt sich dadurch der folgende String:

      Hello, WORLD!

      Sie können auch weitere Template-Literale in dem ${...}-Ausdruck verschachteln:

      greeting = `Hello, ${firstname.length > 0 ? `${firstname[0]}. ` : '' }

      ${lastname}`

      Alle Zeilenumbrüche innerhalb des Template-Literals werden in den String aufgenommen. Betrachten Sie dazu das folgende Beispiel:

      greeting = `<div>Hello</div>

      <div>${destination}</div>

      `

      Hier wird greeting auf den String '<div>Hello</div>\n<div>World</div>\n' mit Zeilenumbrüchen hinter jeder Zeile gesetzt. (Für den resultierenden String werden die Windows-Zeilenende-Zeichen \r\n in das Unix-Zeilenende-Zeichen \n umgewandelt.)

      Um

Скачать книгу