Funktion mb_strlen() - String-Länge ermitteln
Bei der Verarbeitung von Zeichenketten möchte man häufig die Anzahl der Zeichen eines strings ermitteln, z.B. ob die Postleitzahl 5 Zeichen enthält. Mit der Funktion strlen() kann man das zwar bewerkstelligen. Allerdings ist das Ergebnis nicht genau, da man mit strlen() bei genauerer Betrachtung nicht die Anzahl der Zeichen einer Zeichenkette ermittelt, sondern die Anzahl der Bytes, die eine Zeichenkette belegt. Da angenommen wird, dass jedes Zeichen ein Byte belegt, wird der Rückgabewert der Funktion strlen() häufig mit der Anzahl der Zeichen gleichgesetzt.
Wie viele Bytes ein Zeichen belegt, hängt jedoch von der Zeichenkodierung ab und das kann dazu führen, dass man als Rückgabewert eine Zahl erhält, die nicht der Anzahl der Zeichen eines strings entspricht. Ein Beispiel hierfür sind die Umlaute Ä, Ö, Ü oder das ß. Speichert man eine PHP-Datei mit der Zeichenkodierung ANSI, belegen diese Zeichen ein Byte. Wird die Datei dagegen mit UTF-8 gespeichert, belegen sie 2 Bytes. Einen Test kann man mit dem folgenden Code durchführen, indem man die Datei mit UTF-8 speichert. Die Rückgabewerte sind jeweils 2, obwohl die strings nur 1 Zeichen enthalten.
<?php
$str = 'Ä';
// Ausgabe 2
echo strlen($str);
$str = 'Ö';
// Ausgabe 2
echo strlen($str);
$str = 'Ü';
// Ausgabe 2
echo strlen($str);
$str = 'ß';
// Ausgabe 2
echo strlen($str);
?>
Zeichenkodierung berücksichtigen mit mb_strlen()
Damit bei der Ermittlung der String-Länge die Zeichenkodierung berücksichtigt wird, kann man die sogenannte Multi-Byte-Funktion mb_strlen() verwenden. Hierbei wird als zweiter Parameter die Zeichenkodierung angegeben und man erhält dadurch genauere Rückgabewerte als bei strlen(), bei der die Zeichenkodierung nicht berücksichtigt wird.
<?php
$str = 'Ä';
// Ausgabe 1
echo mb_strlen($str, 'UTF-8');
$str = 'Ö';
// Ausgabe 1
echo mb_strlen($str, 'UTF-8');
$str = 'Ü';
// Ausgabe 1
echo mb_strlen($str, 'UTF-8');
$str = 'ß';
// Ausgabe 1
echo mb_strlen($str, 'UTF-8');
?>
Hierbei muss man aufpassen, dass man auch die Zeichenkodierung angibt, mit der eine Datei gespeichert wurde. Beim folgenden Beispiel wurde die Datei mit der Zeichenkodierung UTF-8 gespeichert, als Parameter wurde jedoch iso-8859-1 angegeben. Die Rückgabewerte entsprechen nicht der tatsächlichen Anzahl der Zeichen, weil Ä, Ö, Ü und ß unter iso-8859-1 2 Bytes belegen.
<?php
$str = 'Ä';
// Ausgabe 2
echo mb_strlen($str, 'iso-8859-1');
$str = 'Ö';
// Ausgabe 2
echo mb_strlen($str, 'iso-8859-1');
$str = 'Ü';
// Ausgabe 2
echo mb_strlen($str, 'iso-8859-1');
$str = 'ß';
// Ausgabe 2
echo mb_strlen($str, 'iso-8859-1');
?>
Mit der Zeichenkodierung Windows-1252 (ANSI) belegen die Zeichen Ä, Ö, Ü und ß nur 1 Byte. Beim folgenden Beispiel wurde die Datei mit der Zeichenkodierung ANSI gespeichert und die Rückgabewerte entsprechen der Anzahl der Zeichen.
<?php
$str = 'Ä';
// Ausgabe 1
echo mb_strlen($str, 'Windows-1252');
$str = 'Ö';
// Ausgabe 1
echo mb_strlen($str, 'Windows-1252');
$str = 'Ü';
// Ausgabe 1
echo mb_strlen($str, 'Windows-1252');
$str = 'ß';
// Ausgabe 1
echo mb_strlen($str, 'Windows-1252');
?>
Der zweite Parameter mit der Zeichenkodierung kann auch entfallen. In dem Fall wird die interne Zeichenkodierung verwendet. Welche das ist, kann man mit der Funktion mb_internal_encoding() ermitteln.
<?php
echo mb_internal_encoding();
?>
Falls man die Einstellung für die interne Zeichenkodierung ändern möchte, kann man in der PHP-Konfigurationsdatei php.ini den Eintrag mbstring.internal_encoding = anpassen. Die Funktionen mb_internal_encoding und mbstring.internal_encoding gelten ab PHP 5.6 jedoch als deprecated und sollen nicht mehr verwendet werden. Stattdessen soll in der php.ini der Eintrag default_charset angepasst werden. Außerdem ist die Funktion mb_strlen() nur verfügbar, wenn die PHP-Erweiterung mbstring aktiviert ist. Die Verfügbarkeit der Erweiterung kann man mit der Funktion phpinfo() überprüfen. Welche Zeichenkodierungen unterstützt werden, kann man mit mb_list_encodings() überprüfen. Der Rückgabewert hierbei ist ein Array, das man z.B. mit der foreach-Schleife ausgeben lassen kann.