PHP und Multibyte Strings oder: Meine kleine String Klasse

Tags:
Seite:
1
2

Also ich vor einiger Zeit ein wenig mit Ruby rumspielte, kam ich auf die Idee eine String-Klasse für PHP zu schreiben. Heute stöberte ich im Blog von Benjamin Hofmann rum und fand dabei seinen pragmatischen Ansatz für eine String Klasse. Dies motivierte mich auch meinen Versuch zu präsentieren.

In PHP ist ein String eine Reihe von Bytes, wobei ein Byte einem Zeichen entspricht. Das Problem ist, dass ein Byte nur 256 unterschiedliche Zustände haben kann. Ergo können nur 256 unterschiedliche Zeichen dargestellt werden. Bis PHP 6 dann gross mit Unicode auftrumpfen wird, müssen sich alle nicht-amerikanischen PHP Entwickler selber helfen.

Multibyte-Strings in PHP

Schauen wir uns z.B. folgendes Code-Snippet in einer UTF-8 Datei (womit wir ja hoffentlich alle arbeiten) an:

echo strlen('ä');</pre>

Die Ausgabe ist nicht etwa 1, sondern 2, da zur Speicherung das ä-Zeichens zwei Bytes benötigt werden. Als Abhilfe stehen drei Möglichkeiten zur Verfügung.

mbstring Erweiterung

echo mb_strlen('ä'); // 1

Die mbstring Erweiterung wird direkt mit PHP ausgeliefert und bietet Multibyte-Alternativen für viele native String Funktionen. Die Portierbarkeit ist dadurch ziemlich gut, allerdings werden nicht sehr viele Character Sets unterstützt. Mit der Konfigurationsdirektive mbstring.funcoverload lassen sich ausserdem die nativen String Funktionen durch alle vorhandenen mbstring-Äquivalente "überladen" (an Stelle von strpos() wird automatisch  mbstrpos() aufgerufen). mbstring eignet sich dadurch sehr gut zum Arbeiten mit Strings.

iconv Erweiterung

echo iconv_strlen('ä'); // 1

Die iconv Erweiterung wird standardmässig nicht mit PHP ausgeliefert und ist deshalb auch nicht auf allen Systemen automatisch vorhanden. Ausserdem gibt es wenige Funktionen zum Arbeiten mit Multibyte-Stringen. Weil die iconv Erweiterung aber viele Character Sets unterstützt, eignet sie sich hervorragend zum Konvertierten von einem Encoding ins andere.

UTF-8 Dekodierung

echo strlen(utf_decode('ä')); // 1

Solange eine Seite - und damit meine ich sowohl Code als auch Files, Datenbank, Formulardaten, etc. - in UTF-8 betrieben wird, ist die Benutzung der nativen String Funktionen relativ sicher möglich. Man sollte einfach schauen, dass die UTF-8 Strings zuerst mit utf8_decode() in ISO-8859-1 Strings konvertiert werden.

Auf der nächsten Seite geht es weiter mit meiner String Implementierung ...

Seite:
1
2

Ähnliche Artikel

Kommentare