Viele typische Aufgaben in der Webentwicklung hängen davon ab, wie lang ein String tatsächlich ist.

Einleitung: Die Bedeutung von Stringlängen in PHP
Die Ermittlung der Stringlänge zählt zu den häufigsten Aufgaben bei der Arbeit mit PHP. Gründe gibt es viele: Ob du Benutzereingaben prüfst, Texte auf eine bestimmte Länge bringst oder kontrollierst, ob Inhalte in eine Datenbankspalte passen – fast immer musst du wissen, wie lang ein String wirklich ist.
Dafür nutzt man in PHP meist die Funktion strlen(). Sie gilt als Standard, um die Länge eines Strings zu bestimmen. Doch Vorsicht: Was bei einfachen ASCII-Zeichen problemlos klappt, kann bei mehrbyteigen Zeichen wie Umlauten oder asiatischen Schriftzeichen im UTF-8-Format schnell zu falschen Ergebnissen führen – denn strlen() zählt nicht Zeichen, sondern Bytes.
Genau hier kommt mb_strlen() ins Spiel.
Im Folgenden findest du eine umfassende Anleitung, die alle Aspekte von strlen() und die typischen Stolperfallen bei der Arbeit mit Multibyte-Strings abdeckt.
Was genau macht PHP strlen()? Die Grundlagen
Die Funktion strlen() zählt die Bytes eines Strings, nicht die sichtbaren Zeichen. Bei ASCII-Texten entspricht ein Byte immer einem Zeichen. Bei UTF-8 und anderen Multibyte-Kodierungen besteht ein sichtbares Zeichen oft aus mehreren Bytes. Deshalb liefert strlen() bei Umlauten oder Symbolen meist einen höheren Wert, als du Zeichen siehst. Die Funktion gibt immer einen Integer zurück, der die Byte-Länge des Strings angibt.
Sonderfall:
Wird ein leerer String übergeben, gibt strlen() den Wert 0 zurück.
Syntax von strlen()
/** Ermittelt die Länge eines Strings in Bytes */
int strlen(string $sText);
- $sText: Der zu untersuchende String (obligatorisch).
Einfache strlen() Beispiele
Beispiel 1: ASCII-String
$sText = "Hallo";
/** Gibt 5 zurück, da "Hallo" fünf ASCII-Zeichen enthält */
$iLaenge = strlen($sText);
echo $iLaenge;
// Ausgabe: 5
Beispiel 2: String mit Leerzeichen und Satzzeichen
$sText = "Guten Tag!";
/** Leerzeichen und Satzzeichen zählen mit */
$iLaenge = strlen($sText);
echo $iLaenge;
// Ausgabe: 10
Beispiel 3: Leerer String
$sText = "";
/** Gibt 0 zurück, da der String leer ist */
$iLaenge = strlen($sText);
echo $iLaenge;
// Ausgabe: 0
Der kritische Punkt: strlen() und Zeichenkodierungen (ASCII vs. UTF-8)
Gerade bei internationalen Websites stößt man schnell an Grenzen, wenn man Zeichenlängen nicht von Bytelängen unterscheidet.
Das Problem:
Viele Sprachen und Sonderzeichen werden in modernen Webanwendungen als UTF-8 gespeichert. Hier kann ein Zeichen mehr als ein Byte beanspruchen.
-
Single-Byte-Kodierungen (ASCII, ISO-8859-1):
1 Zeichen = 1 Byte → strlen() zählt korrekt die Zeichen.
-
Multi-Byte-Kodierungen (UTF-8):
Ein Zeichen kann 1–4 Bytes beanspruchen (z. B. „ä“, „ß“, „中“).
strlen() zählt aber immer die Bytes – nicht die sichtbaren Zeichen.
Typisches Problem-Beispiel:
$sText = "Mädchen";
/** "ä" ist in UTF-8 zwei Bytes lang */
echo strlen($sText);
// Ausgabe: 8 (statt 7!)
String | Sichtbare Zeichen | strlen() (Bytes) |
Hallo | 5 | 5 |
Grüße | 6 | 7 (wegen “ü”) |
Überflieger | 12 | 13 (wegen “Ü”) |
中华 | 2 | 6 |
Die Lösung für korrekte Zeichenanzahl: mb_strlen()
mb_strlen() stammt aus der Multibyte String Extension (mbstring) und zählt die tatsächliche Zeichenanzahl auch bei UTF-8 korrekt.
Syntax:
int mb_strlen(string $sText, ?string $sKodierung = null)
- $sKodierung: Optional. Häufig „UTF-8“. Wenn nicht angegeben, nutzt PHP die Standardkodierung (meist systemabhängig).
Beispiel: strlen() vs. mb_strlen() mit Umlauten
$sText = "Grüße";
/** strlen() zählt Bytes */
echo strlen($sText); // Ausgabe: 7
/** mb_strlen() zählt Zeichen */
echo mb_strlen($sText, 'UTF-8'); // Ausgabe: 5
Beispiel: Chinesische Zeichen
$sText = "中文";
/** strlen() zählt Bytes */
echo strlen($sText); // Ausgabe: 6
/** mb_strlen() zählt Zeichen */
echo mb_strlen($sText, 'UTF-8'); // Ausgabe: 2
Empfehlung:
Verwende immer mb_strlen($sText, 'UTF-8') für Benutzereingaben oder internationale Inhalte.
Typische Anwendungsfälle für strlen() (und mb_strlen())
Ob Anmeldemaske, Kommentarspalte oder Passwortfeld – oft entscheidet die Stringlänge darüber, ob eine Eingabe akzeptiert wird.
Validierung von Benutzereingaben
Beispiel: Mindest- und Maximallänge für Benutzernamen prüfen
$sName = "Müller";
/** strlen() ist hier NICHT ausreichend */
if (mb_strlen($sName, 'UTF-8') < 3 || mb_strlen($sName, 'UTF-8') > 20) {
echo "Name zu kurz oder zu lang!";
}
Textkürzung und Vorschauen
$sText = "Dies ist ein Beispieltext mit Umlauten: äöü";
/** Nur die ersten 10 Zeichen anzeigen (korrekt bei UTF-8!) */
$sVorschau = mb_substr($sText, 0, 10, 'UTF-8');
echo $sVorschau;
Bedingte Logik und Schleifen
$sCode = "ABC123";
/** Aktionen basierend auf Länge ausführen */
if (strlen($sCode) === 6) {
/** Code ist korrekt lang */
}
Datenbankinteraktionen
Datenbankfelder sind oft in Zeichen (CHAR, VARCHAR) oder Bytes (z. B. BLOB) definiert.
Achtung: MySQL mit UTF-8 speichert Zeichen als mehrere Bytes! Prüfe immer die Kodierung und nutze ggf. mb_strlen() für die Validierung.
Was passiert mit strlen() bei anderen Datentypen? (Edge Cases)
- strlen(null): Gibt 0 zurück, erzeugt aber eine Warnung (PHP < 8). Ab PHP 8: TypeError.
- strlen(array): Gibt null zurück, E_WARNING (PHP < 8). PHP 8: TypeError.
- strlen(int/float): Wandelt Zahl in String um, gibt Länge dieses Strings zurück.
- strlen(true): Wird zu “1” (Länge 1), false zu “” (Länge 0).
Empfehlung: Immer Typ prüfen:
if (!is_string($mWert)) {
/** Typ-Fehlerbehandlung */
}
Oder mit Cast:
$sText = (string)$mWert;
$iLaenge = strlen($sText);
strlen() arbeitet direkt auf dem Speicher, daher ist sie extrem schnell – selbst bei großen Strings oder in Schleifen.
mb_strlen() ist etwas langsamer, da Zeichen analysiert werden. In den allermeisten Fällen spielt der Unterschied keine Rolle – Korrektheit geht immer vor Mikro-Optimierung.
Verwandte PHP String-Funktionen
- count() – Gibt die Anzahl von Elementen in Arrays zurück, nicht für Stringlänge.
- substr() / mb_substr() – Teilstrings extrahieren (mit UTF-8-Unterstützung über mb_substr).
- strpos() / mb_strpos() – Position von Zeichen/Substrings finden.
- trim() – Entfernt Whitespace an den Rändern, was die Länge beeinflussen kann.
Best Practices bei der Verwendung von strlen() und mb_strlen()
Eine falsche Annahme bei der Zeichencodierung kann zu unbemerkten Fehlern führen, die später schwer zu finden sind.
- Kenne deine Daten! Prüfe immer, ob du mit Multibyte-Zeichen arbeitest.
- Immer explizite Kodierung! Bei mb_strlen() „UTF-8“ explizit angeben, nicht auf Standard verlassen.
- Byte vs. Zeichen: Sei dir bewusst, ob du wirklich Bytes (z. B. für binäre Daten) oder Zeichen zählst (Textverarbeitung).
- Vorher Typ prüfen: Vermeide Fehler und Warnungen, indem du vorab prüfst oder castest.
Fazit: Die richtige Funktion für die richtige Aufgabe
strlen() eignet sich für ASCII-Strings und Fälle, in denen die Byte-Anzahl zählt – zum Beispiel bei binären Daten oder reinen ASCII-Feldern.
mb_strlen() ist Pflicht für alles, was mit internationalem Text, Benutzer-Input oder moderner Webentwicklung zu tun hat. Prüfe immer, was du wirklich brauchst, und teste im Zweifel mit verschiedenen Zeichensätzen!
Interaktives Code-Snippet
$sText = "Grüße aus Erfurt";
/** Gibt die Länge in Bytes und Zeichen (UTF-8) aus */
echo "strlen: " . strlen($sText) . "n";
echo "mb_strlen: " . mb_strlen($sText, 'UTF-8') . "n";
/** Ausgabe:
strlen: 18
mb_strlen: 16
*/