Verse verwendet Strings als Typ zum Speichern und Handhaben von Text, wie zum Beispiel "Hello Verse" und "Epic Games". In Verse kann ein String Buchstaben, Zahlen, Satzzeichen, Leerzeichen und Emojis enthalten. Ein String, der keine Zeichen innerhalb "" enthält, wird als leerer String bezeichnet.
Du kannst vordefinierte String-Werte in deinen Code als String-Literale einbinden. Ein String-Literal ist eine Abfolge von Zeichen in deinem Code, die von doppelten Anführungszeichen " " umgeben ist.
Das folgende Beispiel zeigt, wie du eine Zeichenketten-Variable mit dem Namen Hallo erstellst und mit dem Zeichenketten-Literal “Hello world" initialisierst:
Hello : string = "Hallo Welt"
Zeichenkodierung
Die Zeichenkodierung ist die Zuordnung zwischen einem Textzeichen und Daten, die der Computer verstehen kann, und wird als Codepunkt bezeichnet.
Verse verwendet das Zeichenkodierungsschema UTF-8 Unicode, ein vom Unicode Consortium entwickelter Standard, um für Zeichen über Sprachen und Plattformen und Geräte hinweg eine vergleichbare Unterstützung bereitzustellen.
Zum Beispiel kann das Emoji in diesem String "🐈" auch durch den Unicode-Codepunkt "{0u1f408}" als Emoji dargestellt werden. Eine vollständige Liste der in Unicode unterstützten Zeichen und ihrer entsprechenden Codepunkte findest du in der Unicode-Dokumentation.
Die UTF-8 Code-Einheit ist 8-bits (ein byte) und kodiert Zeichen mit Codepunkten, die ein bis vier Byte lang sind. Codepunkte mit einem niedrigeren Wert verwenden weniger Bytes als Codepunkte mit höheren Werten. Beispielsweise verwendet "a" ein Byte "{0o61}", während "á" zwei Bytes "{0oC3}{0oA1}" verwendet.
String-Operationen
Zeichenketten unterstützen Verkettung, Vergleich, Indizierung, die die Länge der Zeichenkette und die Zeichenketten-Interpolation erhalten.
Verkettung
Verkettung ist, wenn ein String an einen anderen String angehängt wird. Du kannst den Operator + verwenden, um Zeichenketten zu verketten.
Der folgende Code führt beispielsweise dazu, dass die Variable Announcement den String "...Und der Gewinner ist" enthält: Spieler Eins!"`.
# Der Name des Gewinners:
WinningPlayerName : string = "Spieler Eins"
# Erstelle eine Nachricht, die den Gewinner ankündigt.
Announcement : string = "...Und der Gewinner ist: " + WinningPlayerName + "!"
String-Interpolation
Du kannst einen Wert in einen String einfügen, wenn im aktuellen Bereich eine gültige ToString()-Funktion definiert ist.
Der folgende Code führt beispielsweise dazu, dass die Variable Announcement den String "...Und der Gewinner ist" enthält: Spieler Eins!"`.
# Der Name des Gewinners:
WinningPlayerName : string = "Spieler Eins"
# Erstelle eine Nachricht, die den Gewinner ankündigt.
Announcement : string = "...Und der Gewinner ist: {WinningPlayerName}!"
Vergleich
Ob zwei Strings gleich sind, hängt davon ab, ob sie die gleichen Zeichen verwenden.
Der Vergleich von Strings in Verse erfolgt durch Vergleich der Codepunkte eines jeden Zeichens. Beim Vergleich zweier Strings wird zwischen Groß- und Kleinschreibung unterschieden, da Groß- und Kleinbuchstaben unterschiedliche Codepunkte haben.
Du kannst den fehlbaren Operator = verwenden, um zu testen, ob zwei Strings gleich sind, und den fehlbaren Operator <>, um auf Ungleichheit zu testen.
Es kann mehrere Möglichkeiten geben, um in Unicode dasselbe Zeichen darzustellen. Zum Beispiel ist "é" "{0u0049}", aber du kannst auch zwei Codepunkte verwenden: "{0u0065}", das ist "e", und "{0u0301}", das ist ein kombinierender Akzent. Das bedeutet, dass wenn du diese Strings vergleichst, die beide anscheinend das Zeichen "é"aber unterschiedliche Codepunkte verwenden, die Strings nicht gleich sein werden. "{0u0049}" ist nicht mit "{0u0065}{0u0301}" identisch.
Das folgende Beispiel würde prüfen, ob der Spieler das richtige Element verwendet hat, um in einem Abenteuer-/Rätselspiel voranzukommen:
# Dies ist das Element, das vom Rätsel benötigt wird, um den nächsten Schritt freizuschalten:
ExpectedItemInternalName : string = "RedPotion"
# Dies ist das Element, das der Spieler ausgewählt hat:
SelectedItemInternalName : string = "BluePotion"
# Überprüfe, ob der Spieler das richtige Element ausgewählt hat.
if (SelectedItemInternalName = ExpectedItemInternalName):
# Das hat er! Melde, dass das Rätsel mit dem nächsten Schritt fortfahren kann.
return true
# Das hat er nicht! Melde, dass dieses Element das Rätsel nicht voranbringt.
return false
Länge
Du kannst die Anzahl der UTF-8-Codeeinheiten in einem String ermitteln, indem du auf den Untersatz Length des Strings zugreifst. Beispiel: "Hi".Length ist 3.
Die Länge eines Strings berücksichtigt die Datenmenge, die erforderlich ist, um den String in UTF-8-Codeeinheiten darzustellen. Zum Beispiel ist "héy".Length4, da eine zusätzliche UTF-8-Codeeinheit erforderlich ist, um das Zeichen é darzustellen, obwohl der String drei Zeichen zu haben scheint. Der folgende Code zeigt einen "Sekunden"-Timer mit zwei Ziffern an. Bei Bedarf wird die Anzeige mit einer führenden Null aufgefüllt.
# SecondsRemaining wird als nicht negativ angenommen
Verbleibende Sekunden : int = 30
# Konvertiere die int-Darstellung automatisch in einen String:
SecondsString:string = SecondsRemaining
# Richte den Timer-Anzeige-String ein.
var Combined : string = "Verbleibende Zeit: "
# Ist der String zu lang, ersetze sie durch den maximal zweistelligen Wert, 99.
if (SecondsString.Length > 2):
# Zu viel Zeit auf der Uhr! Lege den String auf einen fest codierten Maximalwert fest.
set Combined += "99"
else if (SecondsString.Length < 2):
# Fülle die Anzeige mit einer führenden Null auf.
set Combined += "0{SecondsString}"
else:
# Der String hat bereits die exakte Länge, also füge ihn hinzu.
set Combined += SecondsString
Index
Du kannst auf die UTF-8-Codeeinheit an einem bestimmten Index des Strings zugreifen. Die erste UTF-8-Codeeinheit in einem String hat einen Index von 0 und mit jeder weiteren Codeeinheit erhöht sich die Zahl der Indizes.
Zum Beispiel ist "cat"[0] ein "c" und "cat"[1] ist ein "a".
| Index | 0 | 1 | 2 |
| Character | "c" |
"a" |
"t" |
| **Code Einheit | "{0o63}" |
"{0o61}" |
"{0o74}" |
In Fällen, in denen ein String Zeichen enthält, die durch mehr als eine Codeeinheit dargestellt werden, gibt es einen Index für jede Codeeinheit. Zum Beispiel wird "á" durch zwei UTF-8-Codeeinheiten "{0oC3}{0oA1}" dargestellt, also ist "cát"[1] "{0oC3}" und "cát"[2] ist "{0oA1}".
| Index | 0 | 1 | 2 | 3 |
| Character | "c" |
"á" |
"t" |
|
| **Code Einheit | "{0o63}" |
"{0oC3}" |
"{0oA1}" |
"{0o74}" |
Der letzte Index in einem String ist um eins kleiner als die Länge des Strings. Zum Beispiel ist "cat".Length 3 und der Index für "t" in "cat" ist 2.
Standard-Bibliothek
Die Standardbibliothek bietet Funktionen, die beim Erstellen und Verwenden von Strings helfen. Weitere Details zu diesen Funktionen findest du in der Verse API-Referenz.
Alternative Darstellungen von Zeichen
Für einige Zeichen gibt es alternative Darstellungen, wenn sie in einem String verwendet werden. Beispielsweise kann "{}" für String-Interpolation oder für die Codepunkte von Zeichen verwendet werden, aber sie können auch selbst als Klammerzeichen {} im Text verwendet werden.
Um eine alternative Darstellung eines Zeichens in einem String verwenden zu können, musst du das Escape-Zeichen "\" vor dem Zeichen im String hinzufügen. So wird zum Beispiel "\{\}" als {} im Text wiedergegeben, und "\n" beginnt eine neue Zeile im Text.
Implementierungsdetails
Der Typ String ist ein Typ-Alias von []char, eines Arrays von UTF-8-Codeeinheiten. Da String ein Typ-Alias für einen Array ist, verhält sich der String genauso wie Arrays.
Es gibt zwei primitive Typen für Zeichen, abhängig von ihrer Größe und ihrem Codepunktformat — char und char32. Die einzigen Fähigkeiten von char und char32 in Verse sind der Vergleich und der Zugriff auf ihre Werte.
| Primitiver Typ | Beschreibung | Unterstützte Formate |
|---|---|---|
| char | Ein primitiver Typ, der eine einzelne UTF-8-Codeeinheit (ein Byte) bis zum Wert 256 (0off) darstellt. |
Code-Einheiten der Form 0oXX. Zum Beispiel, 0o52. |
| char32 | Ein primitiver Typ, der einen Unicode-Codepunkt darstellt. Codepunkte der Form 0uXXXX. Zum Beispiel 0u0041. |
Du kannst auch Literale mit einfachen Anführungszeichen ausdrücken. Ob der primitive Typ des Strings in einfachen Anführungszeichen char or char32 ist, hängt von den UTF-8-Codeeinheiten ab, die für das Zeichen verwendet werden. Zum Beispiel 'e' ist char und 'é' ist char32`.
Dauerhafte Typen
Die Werte String, char und char32 sind dauerhaft, was bedeutet, dass du sie in deiner modulbereichsbezogenen Variable weak_map verwenden kannst und ihre Werte dann über Spielsitzungen hinweg erhalten bleiben. Weitere Details zum Fortbestand in Verse findest du unter Verwenden dauerhafter Daten in Verse.