Text-Verarbeitung in Rust ist gleichzeitig strenger und ehrlicher als in den meisten anderen Sprachen. Strenger, weil die Sprache zwei String-Typen unterscheidet — &str und String — und weil Index-Zugriffe auf Zeichen-Ebene unmöglich sind. Ehrlicher, weil sie UTF-8 als Default und Pflicht durchzieht: kein versteckter Code-Page-Wechsel, keine 16-Bit-Surrogate-Tricks. Dieses Kapitel führt durch die zentrale Unterscheidung str/String, zeigt, wie sicheres Slicing in einem UTF-8-Buffer funktioniert, behandelt das format!-Makro in voller Breite, klärt das Parsing aus Strings und schließt mit Cow<str> — dem eleganten Copy-on-Write-Werkzeug für Funktionen, die manchmal allokieren müssen, oft aber nicht.
Was dich in diesem Kapitel erwartet
- str vs. String — der vielleicht häufigste Stolperstein für Einsteiger.
&strist ein geborgter View auf UTF-8-Bytes;Stringist ein heap-allozierter, wachsender Container. Wann brauchst du was? - String-Slicing und Bytes — UTF-8 hat variable Byte-Längen pro Zeichen. Slicing wie
&s[0..5]funktioniert, aber nur an Zeichen-Grenzen. Was passiert, wenn man eine falsche Grenze trifft, und wie man sicher slict. - UTF-8 und char-Iteration — die drei Wege, einen String durchzulaufen: byteweise, charweise, graphemeweise. Welcher wann sinnvoll ist und warum „Anzahl der Zeichen" mehrdeutig sein kann.
- Das format!-Makro — Format-Strings mit Width, Precision, Padding, Hex/Bin/Oct, named arguments und debug- vs. display-Format. Compile-Time-Validierung statt printf-Fallen.
- Parsing und Konvertierung — Strings zu Zahlen, eigenen Typen, Datenstrukturen:
parse(), derFromStr-Trait und die Stelle, an derDisplayundDebugins Spiel kommen. - Cow<str> — der Smart-Pointer, der mal eine Referenz, mal ein owned String ist. Ideal für Funktionen wie „normalisiere diesen Text — wenn er schon sauber ist, gib ihn unverändert zurück".
Warum Rust Text anders macht
Drei Eigenheiten, die Strings in Rust prägen:
- UTF-8 als Pflicht. Ein
Stringist garantiert UTF-8. Es gibt keinen Code-Path, der invalide Bytes hineinschmuggelt — die einzige Möglichkeit dazu führt durchunsafe. Praktisch heißt das: jede&str-Funktion arbeitet auf garantiert wohlgeformtem UTF-8. - Keine Index-Indirektion.
s[i]ist ein Compile-Fehler. Hintergrund: UTF-8 hat variable Byte-Längen pro Zeichen, also könntes[2]mitten in einem Multi-Byte-Code-Point landen. Wer das n-te Zeichen will, schreibts.chars().nth(n)(O(n) und ehrlich). - Borrows trennen Lese- und Schreibwege.
&strist immutable und sehr leicht.Stringist heap-alloziert und mutable. Diese Trennung ermöglicht, dass viele Funktionen nur&strals Parameter brauchen — was sowohl statisch eingebettete als auch dynamisch konstruierte Strings akzeptiert.
Was du nach diesem Kapitel kannst
- Bewusst zwischen
&strundStringwählen — und in API-Designs den richtigen Parameter-Typ. - Sicher in einen UTF-8-Buffer slicen, ohne Panic.
- Einen String byteweise, charweise oder graphemeweise iterieren.
format!für formatierte Ausgaben, Logging, Templates nutzen.- Strings in eigene Typen parsen und mit
Displayeigene String-Repräsentationen liefern. Cow<str>einsetzen, um in API-Funktionen die Allokation auf den minimal nötigen Pfad zu beschränken.
Das nächste Kapitel behandelt Kontrollfluss: if, match, loop, while, for — alles, was nicht-lineare Ausführung erlaubt.
Weiterführende Ressourcen
Externe Quellen
- The Rust Book – Strings
- Rust Reference – Textual types
- std::string::String
- std::str
- std::borrow::Cow
- Unicode UAX #29 – Text Segmentation