PHP und UTF-8

Die Programmiersprache PHP verarbeitet bis Version 5 nur 1-Byte-Zeichen. Strings, die etwa UTF-8 codierte Zeichen enthalten, werden von den Standart-Stringfunktionen oft fehlerhaft verarbeitet.

Die Funktion utf8_decode() bietet eine rudimentäre Möglichkeit, UTF-8 Strings in 1-Byte-Strings zu konvertieren. Dabei kann allerdings Informationsverlust auftreten.
Mit den Multibyte-Stringfunktionen bietet PHP allerdings eine mächtige Methodensammlung, um etwa UTF-8-Strings zu verarbeiten. Mit Hilfe von Regular-Expressions können damit die meisten Stringmanipulationen geleistet werden. PHP muss, um die Multibyte-Stringfunktionen nutzen zu können, mit der mbstring-Erweiterung kompiliert werden.

Eine Alternative bietet die Scriptsammlung der splitbrain-Entwickler, deren Funktionen klassische Stringfunktionen simmulieren und dabei UTF-8-Strings verarbeiten können, ohne auf die mbstring-Erweiterung angewiesen zu sein.

Da die Sammlung keinen Ersatz für str_word_count() enthält, habe ich mal einen geschrieben.
utf8_str_word_count():

/**
* Works like str_word_count() for UTF8-strings
* does not support locale information
* does not exclude "'" or "" on beginning of a word
* may behave strange if $format is not 0, 1 or 2
*/
function utf8_str_word_count($string,$format=0,$charlist='') {
$array = preg_split("/[^'\-A-Za-z".$charlist."]+/u",$string,-1,PREG_SPLIT_NO_EMPTY);
switch ($format) {
case 0:
return(count($array));
case 1:
return($array);
case 2:
$pos = 0;
foreach ($array as $value) {
$pos = utf8_strpos($string,$value,$pos);
$posarray[$pos] = $value;
$pos += utf8_strlen($value);
}
return($posarray);
}
}

Achtung, die Funktion verwendet weitere UTF-8-Funktionen (utf8_strpos und utf8_strlen) aus der Scriptsammlung von splitbrain.

Die Entstehung dieser Funktion ist in diesem Forenbeitrag dokumentiert.

Auf nicknettleton gibts noch wichtige Tipps, um das gesamte System inkl. Datenbank auf UFT-8 umzustellen.

Ein String ist eine Folge von Zeichen. Dieser kann von einer Programmiersprache in Variablen gespeichert und mittels Funktionen weiter verarbeitet werden.
Es gibt allerdings unterschiedliche Arten, wie Zeichen abgespeichert werden, character encodings genannt. Ist ein String etwa als ASCII gespeichert, können darin nur Zeichen aus der ASCII-Zeichentabelle verwendet werden. Jedes Zeichen nimmt dabei ein Byte Speicherplatz ein.

Da in den Sprachen der Welt eine Fülle verschiedenster Zeichen zur Anwendung kommen, wurden zur Standartisierung der Speicherung zunächst der ISO-Standart, später Unicode entwickelt.
UTF-8 ist der aktuelle Standart zur Speicherung von Zeichen. Er enthält eine Vielzahl von Zeichen aus vielen Sprachen. Zur Speicherung werden ein bis acht Byte verwendet.

Advertisements

About this entry