Kiste
DE

The book is currently only available in German.

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 als a, mal als ae, mal nach z einsortiert (je nach DIN-Norm und Kontext).
  • Im Schwedischen kommt å nach z.
  • 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.