Texte (Strings) im Detail
10.1 Verkettung
nimm a = "Hallo"
nimm b = "Welt"
sag a + " " + b // "Hallo Welt"
10.2 Sonderzeichen (Escapes)
sag "Mit \"Anführungszeichen\""
sag "Zeilenumbruch:\nNeue Zeile"
sag "Tab:\tHier"
sag "Backslash: \\"
Die vollständige Liste:
| Escape | Bedeutung |
|---|---|
\" |
Anführungszeichen |
\\ |
Backslash |
\n |
Zeilenumbruch |
\t |
Tabulator |
\r |
Wagenrücklauf (Windows-Zeilenenden \r\n) |
\0 |
Null-Byte |
\{ / \} |
literale geschweifte Klammer (sonst startet { eine Interpolation) |
\u{XXXX} |
Unicode-Codepoint hexadezimal, z.B. \u{2764} → |
Alles andere nach \ ist ein Lex-Fehler („unbekannte Escape-Sequenz") — in
Triple-Quoted-Strings ("""…""") werden Escapes gar nicht verarbeitet, dort ist
alles literal.
Trick: farbige Ausgabe mit \u{1B}
\u{1B} ist das Escape-Zeichen der Terminal-Farbcodes (ANSI). Damit färbst du
deine sag-Ausgabe — im Terminal und im Ausgabe-Panel der Kiste-IDE:
sag "\u{1B}[32mGrün!\u{1B}[0m und wieder normal"
sag "\u{1B}[1;31mRot und fett\u{1B}[0m"
Die wichtigsten Codes: [31m rot · [32m grün · [33m gelb · [34m blau ·
[1m fett · [4m unterstrichen · [0m alles zurücksetzen (nicht vergessen,
sonst bleibt die Farbe an!). Helle Varianten: [91m–[97m.
10.3 Länge eines Textes
nimm name = "Sascha"
sag länge(name) // 6
länge(text) zählt Grapheme — also was der Mensch als ein Zeichen sieht. Das macht einen Unterschied bei Umlauten, Emojis und kombinierten Zeichen:
sag länge("café") // 4
sag länge("👨👩👧") // 1 (eine Familie = ein Zeichen)
sag länge("🇨🇭") // 1 (eine Flagge = ein Zeichen)
sag länge("a👨👩👧b") // 3 (a, Familie, b)
Das ist eine Stelle, an der Kiste sich von Python und JavaScript unterscheidet: Kiste zählt das, was du siehst, nicht die internen Codepoints oder Bytes.
Drei Längen-Funktionen
Manchmal brauchst du eine andere Sicht auf den Text:
nimm s = "café"
sag länge(s) // 4 — Grapheme (sichtbare Zeichen)
sag zeichen_länge(s) // 4 — Unicode-Codepoints
sag bytes_länge(s) // 5 — UTF-8-Bytes im Speicher
| Funktion | Was sie zählt | Wofür |
|---|---|---|
länge(text) |
sichtbare Zeichen (Grapheme) | UI, Eingabe-Validierung, alles Menschliche |
zeichen_länge(text) |
Unicode-Codepoints | Selten — Datentransport, manche Algorithmen |
bytes_länge(text) |
UTF-8-Bytes | Speicher-Limits, Datei-Größe, Netzwerk |
10.4 Indizieren und Slicen
text[i] gibt das i-te Grapheme zurück (0-basiert):
nimm s = "café"
sag s[0] // "c"
sag s[3] // "é"
Slicing mit Bereichen (inklusiv, wie bis):
sag "Hallo"[0..2] // "Hal"
sag "Hallo"[1..] // "allo"
sag "Hallo"[..2] // "Hal"
// Auch über Emoji-Grenzen sicher:
sag "a👨👩👧b"[0..1] // "a👨👩👧" — niemals halbiert
10.5 Iterieren
wiederhole zeichen in "🇨🇭👨👩👧" {
sag zeichen
}
// Ausgabe:
// 🇨🇭
// 👨👩👧
wiederhole läuft genau länge(text) Mal — Grapheme für Grapheme.
10.6 Vergleichen — wichtige Stelle!
Kiste vergleicht Strings kanonisch: zwei Schreibweisen desselben Zeichens gelten als gleich.
// "é" als ein Codepoint (precomposed) vs. "e + Akzent" (decomposed)
sag "café" == "cafe\u{0301}" // wahr — beide sehen gleich aus
Das ist anders als in Python oder Go (die wären falsch) und richtig so, weil ein Programm sonst „unsichtbare" Bugs kriegt, je nachdem, in welcher Form ein String reinkam (Tastatur, Dateisystem, Web).
Sortier-Operatoren <, >, <=, >=
Diese vergleichen byte-weise, nicht menschlich. Das ist Absicht:
sag "Apfel" < "Äpfel" // hängt von den Bytes ab — NICHT menschlich-deutsch sortiert
Sortierung in Sprachen ist immer kulturell:
- Im Deutschen wird
ämal alsa, mal alsae, mal nachzeinsortiert (je nach DIN-Norm und Kontext). - Im Schwedischen kommt
ånachz. - Im Türkischen ist
i/ıein eigener Buchstabe.
Wenn < automatisch lokalisieren würde, wäre es für irgendeine Sprache immer falsch. Byte-lex ist deterministisch und neutral.
Kommt später: sortiere_lokal(liste, sprache) für menschlich sinnvolle Sortierung.
10.7 Texte und Zahlen mischen
nimm alter = 38
sag "Alter: " + als_text(alter) // "Alter: 38"
Eleganter ist String-Interpolation:
sag "Alter: {alter} Jahre" // "Alter: 38 Jahre"
In {...} darfst du beliebige Ausdrücke schreiben — die Werte werden automatisch in Text umgewandelt.