PHP – Array Zeichensatz umwandeln

11. August 2009

Häufig kommt man als PHP Entwickler in die Verlegenheit mit Datenbanken zu arbeiten, die nicht komplett auf UTF-8 laufen. Damit man trotzdem vernünftig mit den Daten aus der Datenbank arbeiten kann, muss man diese also in das gewünschte Format dekodieren.

Das Dekodieren einzelner Strings funktioniert recht simpel mit der PHP Funktion

$s = utf8_decode($s);

Wie aber wandelt man ein komplettes Array, beispielsweise ein MySQL Result in UTF-8 um? Neben ein paar verschachtelten For-Each-Schleifen ist eine Möglichkeit die Verwendung der array_walk_recursive Funktion. Mit dieser Funktion kann ein Array komplett rekursiv durchlaufen und auf jedes einzelne Element eine Funktion angewandt werden. Hier ein Beispiel:

$sql = "Your MySQL Query";
$res = mysql_query($sql);
while ($row = mysql_fetch_assoc($res)) {
  $array[] = $row; // Abspeichern des kompletten Results in $array
}
 
// Umwandeln des Arrays in UTF-8
function utf8_conv(&$item, $key){ // Wichtig: Die Referenz übergeben
  $item = utf8_decode($item);
}
 
// Anwenden der Funktion utf8_conv auf jedes Element des Arrays $array
array_walk_recursive($array, 'utf8_conv');

Für das Aufrufen einer Funktion innerhalb einer Klasse muss folgender Syntax verwendet werden:

array_walk_recursive($productArray, array(&$this, 'utf8_conv'));

In diesem Fall steht die Funktion in der selben Klasse, würde also normalerweise mit $this->utf8_conv aufgerufen werden.

3 Kommenare zu “PHP – Array Zeichensatz umwandeln”

  1. Vielen Dank für die kompakte Lösung!

  2. Wingi sagt:

    Hmmm, und in welchem encoding liegen die Daten in der Datenbank vor? Ich stelle mir den Klassiker vor: iso-8851 Webseite, latin-1 Datenbank und utf-8 Export. Klappt dies dann auch so problemlos?

    Spanned auch die Umsetzung in PHP, call-by-reference, um das Feld direkt zu ersetzen. In python würde dies so aussehen:

    newArray = map(utf8_decode, oldArray)

    Gruß aus Leonberg.

  3. admin sagt:

    In unserem Fall lag die Datenbank in latin1_swedish_ci und die Verbindung dorthin in verschiedenen Formaten (utf, latin, …) vor und konnte nicht umgestellt werden.

    Verschiedene Formate in der DB, der Connection, dem Website Encoding und dem Filesystem sind immer ein Problem, dass uns auf Fremdsystemen oft begegnet. Manchmal hilft oben genannte Lösung, manchmal muss man aber auch an den Server ran.

    Am besten ist es natürlich wenn man von Anfang in allen Bereichen auf UTF-8 setzt.

    Grüße zurück aus der Römergalerie in Leonberg

Kommentar verfassen

Artikel suchen

Kategorien

Archiv

Blogroll

Meta

flickr Stream

ref_wieland_001
ref_wertschoepfer_001
ref_sysint_001
ref_starkeschule_002