Читать книгу JavaScript für Ungeduldige - Cay Horstmann - Страница 36
1.10String-Literale
ОглавлениеString-Literale sind in einfache oder doppelte Anführungszeichen eingeschlossen, also z. B. 'Hallo' oder "Hallo". In diesem Buch verwende ich dazu immer einfache Anführungszeichen.
Wenn innerhalb eines Strings ein Anführungszeichen der gleichen Art steht, mit der der String begrenzt ist, dann müssen Sie es mit einem Backslash maskieren. Auch Backslashs selbst und die Steuerzeichen aus Tabelle 1–2 müssen Sie mit Backslashs maskieren.
Beispielsweise ist '\\\'\'\\\n' ein String von fünf Zeichen Länge, der die Zeichenfolge \''\ gefolgt von einem Zeilenumbruch enthält.
Um beliebige Unicode-Zeichen in einen JavaScript-String aufzunehmen, können Sie sie einfach eingeben oder kopieren, wobei die Quelldatei jedoch eine geeignete Kodierung verwenden muss (z. B. UTF-8):
let greeting = 'Hello '
Wenn Ihre Dateien unbedingt ASCII-Format haben müssen, können Sie stattdessen die Schreibweise \u{Codepunkt} verwenden:
let greeting = 'Hello \u{1F310}'
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". |
Tab. 1–2 Maskierungssequenzen für Sonderzeichen
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 ' eine Länge von 8, obwohl er nur sieben Unicode-Zeichen enthält (einschließlich des Leerzeichens zwischen Hello und ). 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 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.