Start · Sprachen · PHP · Referenz · grapheme_strlen

grapheme_strlen

Funktion

Gibt die Länge eines Strings in Graphem-Einheiten (wahrnehmbare Zeichen) zurück, nicht in Bytes oder Codepunkten.

seit PHP 5.3.0 Kategorie: string

Signatur

grapheme_strlen(string $string): int|false

Beschreibung

grapheme_strlen() ermittelt die Anzahl der Graphem-Cluster in einem UTF-8-kodierten String. Ein Graphem-Cluster ist das, was ein Mensch als einzelnes Zeichen wahrnimmt – zum Beispiel ein Buchstabe mit einem kombinierten Akzent-Zeichen, das technisch aus mehreren Unicode-Codepunkten besteht, aber visuell als ein Zeichen erscheint.

Dies unterscheidet sich grundlegend von strlen() (zählt Bytes), mb_strlen() (zählt Codepunkte) und grapheme_strlen() (zählt wahrnehmbare Zeichen). Für Sprachen mit kombinierten Diakritika (z. B. Devanagari, Arabisch, Emoji mit Modifier) ist grapheme_strlen() die korrekteste Methode zur Längenberechnung.

Die Funktion ist Teil der Intl-Extension (International Components for Unicode) und folgt dem Unicode-Standard für Graphem-Cluster-Segmentierung. Der Eingabe-String muss in UTF-8 kodiert sein.

Typische Anwendungsfälle sind die Validierung von Formulareingaben (z. B. maximale Zeichenanzahl aus Nutzersicht), die korrekte Darstellung von Zeichenanzahlen in Texteditoren sowie die Verarbeitung von Emoji-Strings.

Parameter

Name Typ Default Beschreibung
$string Pflicht string Der zu messende UTF-8-kodierte Eingabe-String, dessen Länge in Graphem-Einheiten bestimmt werden soll.

Rückgabewert

Typ
int|false
Beschreibung
Gibt die Anzahl der Graphem-Cluster als int zurück, oder false bei einem Fehler (z. B. ungültige UTF-8-Eingabe).

Beispiele

Vergleich von strlen, mb_strlen und grapheme_strlen

<?php
// Ein 'e' mit kombiniertem Akzent (e + ́ als separate Codepunkte)
$string = "e\u{0301}"; // e + Combining Acute Accent

echo strlen($string);          // Bytes
echo PHP_EOL;
echo mb_strlen($string);       // Unicode-Codepunkte
echo PHP_EOL;
echo grapheme_strlen($string); // Graphem-Cluster (sichtbare Zeichen)
3 2 1

Emoji mit Modifier korrekt zählen

<?php
// Emoji mit Hautfarben-Modifier bestehen aus mehreren Codepunkten,
// sind aber visuell ein einzelnes Zeichen.
$emoji = "\u{1F44D}\u{1F3FD}"; // 👍 + mittlerer Hautfarben-Modifier

echo 'strlen:          ' . strlen($emoji) . PHP_EOL;
echo 'mb_strlen:       ' . mb_strlen($emoji) . PHP_EOL;
echo 'grapheme_strlen: ' . grapheme_strlen($emoji) . PHP_EOL;

// Praktische Validierung: Nutzereingabe maximal 10 sichtbare Zeichen
$input = "Hallo 👍🏽";
if (grapheme_strlen($input) <= 10) {
    echo "Eingabe ist gültig." . PHP_EOL;
}
strlen: 8 mb_strlen: 2 grapheme_strlen: 1 Eingabe ist gültig.

// Wichtig · Fallstricke

Voraussetzung: Die Intl-Extension muss in PHP aktiviert sein (üblicherweise via --enable-intl oder extension=intl in der php.ini). Ohne diese Extension steht die Funktion nicht zur Verfügung.

Der Eingabe-String muss UTF-8-kodiert sein. Bei anderen Kodierungen sollte der String zunächst mit mb_convert_encoding() in UTF-8 umgewandelt werden.

Bei der Verarbeitung von nutzergenerierten Inhalten (z. B. Formulare, Chat-Nachrichten) empfiehlt es sich, grapheme_strlen() statt mb_strlen() zu verwenden, wenn die sichtbare Zeichenzahl aus Nutzerperspektive relevant ist – beispielsweise bei Twitter-ähnlichen Zeichenbeschränkungen.