Menu

PHP strlen(): String-Länge in Bytes und Zeichen

strlen($string) liefert die Länge eines Strings in Bytes; mb_strlen($string) liefert sie in Zeichen. Hier: warum japanischer Text und Emoji unterschiedliche Antworten liefern, wie du auf einen leeren String prüfst und wie du die Länge von Eingaben validierst.

Diese Seite enthält ausführbare Editoren - bearbeiten, ausführen und Ausgabe sofort sehen.

strlen($string) liefert die Länge eines Strings in Bytes. Für Zeichen, die du bei japanischem Text, Buchstaben mit Akzent oder Umlaut und Emoji willst, verwendest du mb_strlen($string). Bei reinem englischem Text liefern beide dieselbe Zahl.

Leerzeichen, Satzzeichen und Zeilenumbrüche zählen alle mit. strlen("a b\n") ist 4.

Bytes vs Zeichen in UTF-8

PHP-Strings sind Folgen von Bytes, und UTF-8 verwendet pro Zeichen unterschiedlich viele Bytes: 1 für ASCII-Buchstaben und Ziffern, 2 für Buchstaben wie é oder ж, 3 für Kana, gängige Kanji, chinesische Zeichen und Symbole wie € und 4 für die meisten Emoji und seltene Kanji wie 𠮷. strlen() addiert die Bytes; mb_strlen() zählt die Zeichen.

Verwende strlen(), wenn Bytes zählen: eine Datenbankspalte mit einer Grenze in Bytes, eine Dateigröße, ein binäres Protokoll. Verwende mb_strlen() für alles, was ein Mensch liest: einen Zeichenzähler, eine Regel „höchstens 20 Zeichen“, Text mit mb_substr() kürzen.

Emoji und Zeichen aus mehreren Codepunkten

mb_strlen() zählt Unicode-Codepunkte. Manches, was ein Leser als ein Zeichen sieht, besteht aus mehreren zusammengefügten Codepunkten: ein Familien-Emoji, eine Flagge, ein Hautton oder ein Buchstabe plus kombinierender Akzent.

Um zu zählen, was ein Leser als einzelne Zeichen sieht (Graphem-Cluster), brauchst du grapheme_strlen() aus der intl-Erweiterung:

echo grapheme_strlen('👨‍👩‍👧');   // 1
echo grapheme_strlen('🇯🇵');     // 1

Für einen Zeichenzähler in einem japanischen Formular reicht mb_strlen() meistens: Jedes Kana und jedes Kanji ist ein einzelner Codepunkt.

Anzeigebreite mit mb_strwidth

In einem Terminal oder einem Layout mit fester Breite belegt ein vollbreites japanisches Zeichen zwei Spalten, während ein halbbreites Katakana oder ein lateinischer Buchstabe eine belegt. mb_strwidth() liefert diese Breite, und das meinen japanische Regeln nach dem Muster „全角は2文字“ meistens.

Prüfen, ob ein String leer ist

Der klarste Test ist ein strikter Vergleich mit ''. strlen($s) === 0 liefert dieselbe Antwort. empty($s) ist nicht dasselbe: Es liefert auch für den String "0" true, und der ist in vielen Formularen eine gültige Antwort.

Ein String aus Leerzeichen ist nicht leer. Schick ihn zuerst durch trim(), wenn reine Leerzeichen als nichts zählen sollen.

strlen(null) und Nicht-Strings

strlen() erwartet einen String. null zu übergeben liefert weiterhin 0, gibt aber seit PHP 8.1 einen Deprecation-Hinweis aus:

Deprecated: strlen(): Passing null to parameter #1 ($string) of type string is deprecated in /home/index.php on line 2

Ein Array wirft TypeError: strlen(): Argument #1 ($string) must be of type string, array given.

Caste den Wert vorher oder setze einen Standardwert, zum Beispiel strlen($value ?? ''). Ganzzahlen werden in Strings umgewandelt, also ist strlen(12345) gleich 5. Um Array-Elemente zu zählen, verwendest du count().

Die Länge von Nutzereingaben prüfen

Eine typische Regel: ein Nutzername mit 3 bis 16 Zeichen, nach dem Trimmen. Verwende mb_strlen(), damit ein japanischer Name in Zeichen gemessen wird, nicht in Bytes.

Mit strlen() statt mb_strlen() würde やまだたろう als 18 zählen und als zu lang abgelehnt, obwohl es sechs Zeichen sind.

Häufig gestellte Fragen

Wie bekomme ich in PHP die Länge eines Strings?

strlen($s) liefert die Anzahl der Bytes und mb_strlen($s) die Anzahl der Zeichen. Bei reinem englischem Text sind sie gleich; für Japanisch, Buchstaben mit Akzent oder Umlaut und Emoji verwendest du mb_strlen().

Warum liefert strlen() bei japanischem Text die falsche Länge?

Sie ist nicht falsch, es werden Bytes gezählt. UTF-8 speichert Kana und gängige Kanji in je 3 Bytes, also ist strlen('日本語') gleich 9, während mb_strlen('日本語') gleich 3 ist.

Wie zähle ich die Zeichen eines Strings mit Emoji?

mb_strlen() zählt Unicode-Codepunkte, also zählt ein einfaches Emoji als 1, aber ein Emoji aus mehreren Codepunkten (eine Familie, eine Flagge, ein Hautton) als mehr. grapheme_strlen() aus der intl-Erweiterung zählt, was ein Leser als ein Zeichen sieht.

Was ist der Unterschied zwischen strlen und count in PHP?

strlen() misst einen String, count() zählt die Elemente eines Arrays. Ein Array an strlen() zu übergeben, wirft in PHP 8 einen TypeError.

Wie prüfe ich in PHP, ob ein String leer ist?

Vergleiche ihn mit einem leeren String: $s === '' oder strlen($s) === 0. Vermeide dafür empty($s), weil es auch den String "0" als leer behandelt.

Illustration der Programmiersprachen bei Coddy

Lerne mit Coddy zu programmieren

LOS GEHT'S