Zeichensalat vermeiden - Teil 3 von 3

von Andreas Gallien (Kommentare: 1)

PHP auf UTF-8 umstellen

Nach Umstellung des Zeichensatzes in der Datenbank folgt nun die Umstellung auf UTF-8 in der PHP-Anwendung.

Dazu sind im ersten Schritt die betroffenen PHP-Dateien mit Texteditor wie Notepad++ zu laden und als UTF-8 speichern. Je nach Anwendung kann es weitere Dateien betreffen, die keine Endung „.php“ aufweisen, z. B. XML- und Template-Dateien. Auf der Linux-Shell geht das deutlich bequemer. Im Beispiel suchen wir in einem Verzeichnis alle PHP-Dateien und konvertieren die Dateien von ISO-8859-1 nach UTF-8.

  • find . -name "*.php" -exec iconv -f ISO-8859-1 -t UTF-8 {} -o {} \;

Die Überprüfung sämtlicher PHP-Dateien unterhalb eines Verzeichnisses auf den korrekten Zeichensatz kann mit einer Kombination von "find" und "file" als Kommando erfolgen:

  • find . -name '*.php' -exec file -i {} \;

UTF-8 im Header senden

Damit die Seiten auch im Browser korrekt dargestellt werden, sollte der Webserver die entsprechende Kodierung an den Client übermitteln. Der Apache Webserver kennt die Direktive AddDefaultCharset, die auch in der .htaccess-Datei übersteuert werden kann. In der .htaccess-Datei lässt sich folgende Zeile hinzufügen, um die gewünschte Ausgabe zu erreichen.

  • AddCharset UTF-8 .html

Ist eine Einstellung am Server nicht möglich, lässt sich ein Header mit PHP senden. Dabei gilt zu beachten, dass der Header vor anderen Ausgaben an den Client gesendet werden muss, denn ansonsten liefert der PHP-Interpreter eine Warnung mit dem Hinweis „PHP Warning:  Cannot modify header information - headers already sent by …“

  • header('Content-Type: text/html; charset=utf-8');

Damit die Seiten im Browser korrekt dargestellt werden, wenn keine Auslieferung eines HTTP-Headers mit einem Zeichensatz stattfindet, sollte die Ausgabe per Meta-Angabe zusätzlich im Header des HTML-Quelltext erfolgen:

  • <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

Eine weitere Alternative ist die Einstellung eines Zeichensatzes in der Konfigurationsdatei php.ini von PHP.

  • default_charset = "UTF-8"

Die Formulare kennen ebenfalls ein für die Umstellung auf UTF-8 interessantes Attribut. Mit accept-charset=“utf-8“ wird dem Browser mitgeteilt, dass die Formularfelder per UTF-8 zu übermitteln sind.

BOM-Header parsen

Viele Versionen von PHP haben Probleme mit UTF-8 kodierten Dateien, die einen BOM-Header am Anfang der Datei aufweisen. Der Interpreter kann diese Dateien nicht korrekt parsen, sofern PHP nicht mit der Option „--enable-zend-multibyte“ kompiliert wurde. Das Problem schlägt sich in einer oben bereits erwähnten Warnung „PHP Warning:  Cannot modify header information - headers already sent by …“ über bereits gesendete Header wieder, wenn eine solche PHP-Datei aufgerufen wird. Liegt die Konfiguration oder ein komplettes Updates von PHP auf eine aktuelle Version außerhalb des Einflussbereiches, bleibt nur das erneute Speichern der betroffenen PHP-Dateien ohne BOM-Header.

E-Mails in UTF-8 senden

Die E-Mails sollten bei der Umstellung nicht vergessen werden. Damit E-Mails beim Empfänger nicht zerstückelt eintreffen, ist dem E-Mail-Header die UTF-8-Kodierung mit auf dem Weg zu geben. Die Nutzung der PHP integrierten Funktion mail verlangt dafür im Header nach einigen zusätzlichen Angaben.

Bequemer funktioniert das Versenden von E-Mail mit PHP-Frameworks wie dem Zend Framework. Sie nehmen dem Entwickler einen Großteil der Arbeit ab, weil Sie die notwendigen Enkodierungen hinter der API verbergeben. Im Zend Framework genügt das Erzeugen eines neuen Objekts Zend_Mail mit der entsprechenden Kodierung als Parameter im Konstruktor.

  • $mail = new Zend_Mail('UTF-8');
  • $mail->setDefaultFrom('info@my-from.de', 'My From');
  • $mail->addTo('info@my-to.de', 'My To');
  • $mail->setSubject('Zeichensalat vermeiden');
  • $mail->setBodyText('Die deutschen Umlaute sind: ä, ö, ü und Ä, Ö, Ü.');
  • $mail->send();

Quellcode kontrollieren und anpassen

Die Arbeiten sind noch nicht vollständig abgeschlossen. Einige String-Funktionen können in PHP mit der Umstellung auf UTF-8 ungewollte Seiteneffekte auslösen. So liefert zum Beispiel die Funktion strlen mit dem Parameter ‚Ä‘ bei einer ISO-8859-1 kodierten Zeichenkette den Wert 1 wohingegen bei der Verwendung von UTF-8 der Wert 2 von der Funktion zurückgegeben wird. Prüfungen auf Zeichenlängen können damit zum Problem werden.

  • var_dump(strlen('Ä')); // int(2)

Weitere Routinen sind strtoupper und strtolower, die plötzlich mit UTF-8 kodierten Zeichenketten nicht mehr Ihren Dienst korrekt verrichten. An dieser Stelle besteht die Möglichkeit auf die Erweiterung mb_string auszuweichen, die Funktionen bereitstellt, mit denen sich auch UTF-8 kodierte Zeichenketten korrekt verarbeiten lassen.

  • var_dump(mb_strlen('Ä', 'UTF-8')); // int(1)

Eine Möglichkeit das Problem auf globaler Ebene zu lösen, ist die Verwendung der Funktionsüberladung aus der Bibliothek mb_string. Sie ermöglicht mit der in der php.ini anzupassenden PHP-Optionen die betroffenen Funktionen mit den zugehörigen Multibyte Funktionen arbeiten zu lassen.

  • [mbstring]
  • mbstring.internal_encoding = UTF-8
  • mbstring.func_overload = 7
  • ….

Die Konfiguration kann alternativ auch innerhalb der <Directory>-Direktive des Apache-Server-Konfiguration erfolgen.

  • php_admin_value mbstring.internal_encoding UTF-8
  • php_admin_value mbstring.func_overload 7

Es sollte auch nicht vergessen werden, den gesamten Quellcode nach den beiden Funktionen utf8_encode und utf8_decode zu untersuchen, denn diese können mit der Umstellung überflüssig geworden sein bzw. verrichten nicht mehr korrekt Ihre Arbeit, weil z. B. weil Sie die Zeichen nun doppelt konvertieren.

Fazit

Die durchgängige Verwendung von Unicode stellt bei größeren Projekten eine Herausforderung dar, die mit guter Planung zu bewältigen ist. Die drei Artikel zeigen, dass zumeist mehr als eine Lösung für die genannten Herausforderungen existieren, so dass auch häufig auch bei restriktiven Servereinstellungen durch einen Provider ein alternativer Weg beschritten werden kann.

Inhalt

  1. Zeichensalat vermeiden - Teil 1 von 3
  2. Zeichensalat vermeiden - Teil 2 von 3
  3. Zeichensalat vermeiden - Teil 3 von 3

Zurück

Einen Kommentar schreiben

Kommentar von www.watchesbuy.co.uk |

Now you can see now exactly why any super star can readily have the funds for your partner elegant clothing. Regardless of whether many of us could not, many of us might consider, considering that there is not a good deal reduce.