logo blechtrottel.net blechtrottel.net
English

XSLT mit PHP4

UTF und ISO

Nicht nur Sablotron, auch andere XML-funktionen in PHP geben nur utf-8 aus. Das kann probleme mit sich bringen, wenn die eigenen webseiten nicht in utf-8 geschrieben sind und darin XSLT mit PHP eingebaut ist. Sonderzeichen werden dann nicht richtig dargestellt. Zwar kann durchaus eine seite auch von den anderen abweichen, also z.B. in utf-8 kodiert sein. Wenn diese webseite aber einen externen stylesheet benutzt, hat der Internet Explorer manchmal probleme damit. Ist die ergebnisseite nämlich in utf-8, ihr externer stylesheet (wie alle anderen seiten) z.B. in iso-8859-1, so ignoriert der IE das CSS. Es lohnt sich also, einen blick auf die möglichkeiten zur umwandlung zu werfen.

Leider gilt auch hier: Die einfachsten funktionen sind nicht in jeder PHP-installation vorhanden. Bei jedem webspace stehen am anfang versuch und irrtum. Oder aber das testpaket der blechtrottel brodaktschns weiter unten auf dieser seite.

Hier kurz der code für die verschiedenen möglichkeiten, die die letzte zeile des codes auf der vorigen seite ersetzen:

utf8_decode()

Das ist die einfachste methode, wenn das ergebnis iso-8859-1 sein soll.

<?php

print utf8_decode($html);

?>

iconv()

Diese methode hat den vorteil, dass das ergebnis nicht iso-8859-1 sein muss, sondern auch etwas anderes sein kann.

<?php

print iconv("utf-8", "windows-1252", $html);

?>

preg_replace()

Funktioniert keine der genannten varianten, so bleibt nur der einsatz von regulären ausdrücken. Die falsch dargestellten sonderzeichen werden durch die richtigen ersetzt. Das angeführte beispiel gilt für die deutschen umlaute und das scharfe s in iso-8859-1. Für andere kodierungen und andere sonderzeichen kopiert man die falschen zeichen am besten aus einer ergebnisseite, bei der die darstellung nicht passt.

<?php

$utf8umlaute = array ('@Ä@',
                      '@ä@',
                      '@Ö@',
                      '@ö@',
                      '@Ü@',
                      '@ü@',
                      '@ß@');

$isoumlaute = array ('Ä', 'ä', 'Ö', 'ö', 'Ü', 'ü', 'ß');

print preg_replace($utf8umlaute, $isoumlaute, $html);

?>

So: Ä präsentiert sich z.B. ein großes umlaut-a aus utf-8 in einer webseite in iso-8859-1. (Die Zeichen '@ @' im codebeispiel werden für das regex array benötigt.)

schlussbemerkung

Die angeführten beispiele waren bzw. sind auf der website der blechtrottel brodaktschns im einsatz. Unser RSS-newsfeed wurde mit Sablotron geparst und mit regulären ausdrücken in iso-8859-1 gebracht. Wie bereits erwähnt, unterstützt unser webspace inzwischen PHP5. Aktuell wird der newsfeed mit libxslt geparst, beim ersetzen mit regulären ausdrücken sind wir geblieben.

Um herauszufinden, welche variante auf dem eigenen webspace funktioniert, gibt es ein testpaket als ZIP zum herunterladen. Der ordner php4xslttest muss entpackt und komplett in das stammverzeichnis (meist htdocs) des webspace geladen werden. Dann einfach die datei php4xslttest.html im ordner aufrufen:

die php4xslttest.html im einsatz
testdatei im einsatz (für größeres bild klicken)

Der server im bild unterstützt XSLT mit libxslt, UTF-umwandlungen mit utf_decode() und natürlich preg_replace(). Die anderen tests liefern eine fehlermeldung (fatal error).

Die test funktionieren auch unter PHP5.

Hinweise zur verbesserung, wünsche, anregungen und beschwerden werden wie immer gerne entgegengenommen. Gedankt sei an dieser stelle allen, die von dieser möglichkeit bereits gebrauch gemacht und uns so bei der überarbeitung des textes geholfen haben.

Für weiterführende hinweise zum thema PHP empfehlen blechtrottel brodaktschns die einschlägigen seiten bei Dynamic Web Pages.

Seite 1 - Seite 2 - Seite 3 - Seite 4