Multibyte-Erweiterung prüfen

Multibyte-Funktionen mit PHP einsetzen

Wenn Sie eine PHP-Anwendung auf die Zeichenkodierung UTF-8 umgestellt haben müssen Sie Ihre Funktionsaufrufe für String-Manipulation umstellen. Ansonsten kann es zu merkwürdigen Effekten kommen.

Das Problem: Zeichenvielfalt braucht Platz

Der Grund ist, dass bei UTF-8 manche Zeichen mehr Platz benötigen als andere. Mit den 256 Möglichkeiten, die ein 8-Bit-Byte bietet, kann man einfach nicht alle Zeichen darstellen, die der Mensch verwendet. Darum gibt es gängige Zeichen wie A oder Z, die ein Byte Platz beanspruchen und länderspezifische, wie unsere Umlaute, die mit zwei ( oder mehr) Bytes dargestellt werden. (Daher auch die Bezeichnung „Multibyte“ für diese Thematik)

Sehen Sie sich zum Beispiel das Wort „Öl“ in der UTF-8-Kodierung an. In hexadezimaler Form ausgedrückt, sieht der String „Öl“ so aus:

C3 96 6C

Das Ö wird also durch die Folge C3 96 gebildet. Wenn Sie diese Zeichenkette nun mit den normalen PHP-Funktionen behandeln, ergeben sich Probleme. So würde beispielsweise ein strlen() auf das Wort Öl in UTF-8-Darstellung das Ergebnis 3 bringen. Noch schlimmer ist der Effekt bei substr(). Möchten Sie das erste Zeichen ausgeben, wird PHP hier das Zeichen mit dem Hexwert C3 ausgeben. Das wird dann entweder ein Fehlerzeichen im Browser erzeugen oder gar nicht ausgegeben, das erwünschte Ö kommt auf jeden Fall nicht.

Fehler ohne Multibyte-Funktionen

Der Grund dafür ist schlicht, dass PHP keine Ahnung davon hat, welche Zeichenkodierung Verwendung findet und einfach nur eine Folge von Zeichen sieht. Die zählt es und gibt das Ergebnis aus.

Die Abhilfe: Multibyte-Funktionen

Sie müssen also PHP einen Schubs geben, dass es sich für den Zeichensatz interessiert. Voraussetzung dazu ist, dass die Erweiterung mb_string installiert und aktiviert ist.

Ob das in Ihren System der Fall ist, prüfen Sie am einfachsten über die Ausgabe der Funktion phpinfo(). Dort muss folgende Sektion sichtbar sein.

Multibyte-Erweiterung prüfen




Für die meisten Zeichenketten-Funktionen gibt es eine Multibyte-Variante. Diese Ersatzfunktionen erkennen Sie am vorangestellten mb_“.

So heisst die Funktion zum Ermitteln der Länge eines Multibyte-String beispielweise mb_strlen().

Diese Funktion gibt auch dann die Länge aus, die man erwartet:

$wort = hex2bin("c3966c"); // "Öl" in UTF-8
echo mb_strlen($wort,"UTF-8");

=> 2

Wichtig ist, dass Sie als letzten Parameter der mb-Funktionen den Zeichensatz nennen, den der String verwendet.

Standard-Zeichensatz für die mb-Funktionen setzen

Der Zwang zur Angabe der Kodierung in den mb-Funktionen ist natürlich lästig. Darum sieht die Erweiterung mb_string einen Standard-Zeichensatz vor, der immer dann verwendet wird, wenn Sie den Parameter weglassen. Die Funktion zum Setzen dieses Standards lautet mb_internal_encoding().

Wenn Sie in Ihrer Anwendung also durchgängig UTF-8 nutzen,  dann schreiben Sie am besten an eine zentrale Stelle:

mb_internal_encoding('UTF-8');

Mit PHP ab Version 5.6 wird das komplett anders: Die Funktion mb_internal_encoding() ist dann als „deprecated“ eingestuft und wird von der PHP-Einstellung default_charset abgelöst. Wenn Sie UTF-8 einsetzen, müssen Sie aber gar nicht daran drehen, denn das ist mit PHP 5.6 der Standardwert.

 

 

 

Ähnliche Beiträge