PHP 6 wird mit Version 6 viel in Sachen Unicode Kompatibilität lernen. Aber man sollte man immer strikte Regeln beachten.
Dieser Beitrag muss noch weiter überarbeitet werden.
== Ursache des Problems ==
Zeichensätze sind ein Abenteuer. Verfolgt man mal die Abläufe vom Editor zur Bash, von der Bash zum Terminal, vom Terminal in den Webserver, vom Webserver zum PHP Prozess, der PHP Prozess liest die Datei die einen Zeichensatz aufweist, der Code verbindet sich dann über das Connection Encoding zum MySQL Prozess, davon zur MySQL Datenbank, von der MySQL Datenbank zur Tabelle und von der Tabelle zu den Spalten so möchte man kaum wahr haben, dass jeder dieser Schritte ein eigenes Encoding verwendet kann.
Aus Erfahrung kann man falsche Daten in der Datenbank haben, die aus irgendwelchen Gründen richtig beim Client landen.
Schalten man irgendwann neue Clients hinzu könnte der Fehler erst auffallen.
== Lösung des Problems ==
Daher ist es sehr wichtig auf einen einheitlichen Zeichensatz zu setzen.
Gegen des Quasi-Standard UTF-8 sprechen keine mir bekannten Argumente. Daher baut dieser Artikel darauf auf, sein System auf UTF-8 zu stellen.
== Datenbank umstellen ==
Alles anzeigen
== Korrekte String Funktionen benutzen ==
In PHP 5 sollte man keine Standard-Stringfunktionen wie strlen, strpos, ... mehr nutzen.
Benutzt stattdessen die Multibyte String Funktionen wie sie hier zu finden sind: php.net/manual/de/ref.mbstring.php
Konkret könnt ihr euren gesamten Quelltext durchsuchen und folgende Funktionen ersetzen:
Alles anzeigen
Die Funktion htmlentities ignoriert den Zeichensatz per Default auch. Daher muss man ihr den dritten Funktionsparameter immer mitgeben:
== Content Type ==
Dateien haben eine Zeichenkodierung und Editoren speichern in dieser. Arbeiten mehrere Personen mit unterschiedlichen Zeichensätzen an der selben Datei kann dies fatale Auswirkungen haben. Daher sollte jeder seine Entwicklungsumgebung auf UTF-8 umstellen.
Bei HTTP Requests sollte dazu der Zeichensatz auch übertragen werden. Benutzt dazu das header Statement.
Damit der Client weiß welcher Zeichensatz ihn erwartet darf man auch die Meta-Angabe nicht vergessen:
== Datenbank Connection Encoding ==
Bei der Nutzung von PHP sollte man das Connection Encoding auf UTF-8 erzwingen.
== Literatur ==
== Ursache des Problems ==
Zeichensätze sind ein Abenteuer. Verfolgt man mal die Abläufe vom Editor zur Bash, von der Bash zum Terminal, vom Terminal in den Webserver, vom Webserver zum PHP Prozess, der PHP Prozess liest die Datei die einen Zeichensatz aufweist, der Code verbindet sich dann über das Connection Encoding zum MySQL Prozess, davon zur MySQL Datenbank, von der MySQL Datenbank zur Tabelle und von der Tabelle zu den Spalten so möchte man kaum wahr haben, dass jeder dieser Schritte ein eigenes Encoding verwendet kann.
Aus Erfahrung kann man falsche Daten in der Datenbank haben, die aus irgendwelchen Gründen richtig beim Client landen.
Schalten man irgendwann neue Clients hinzu könnte der Fehler erst auffallen.
== Lösung des Problems ==
Daher ist es sehr wichtig auf einen einheitlichen Zeichensatz zu setzen.
Gegen des Quasi-Standard UTF-8 sprechen keine mir bekannten Argumente. Daher baut dieser Artikel darauf auf, sein System auf UTF-8 zu stellen.
== Datenbank umstellen ==
Quellcode
== Korrekte String Funktionen benutzen ==
In PHP 5 sollte man keine Standard-Stringfunktionen wie strlen, strpos, ... mehr nutzen.
Benutzt stattdessen die Multibyte String Funktionen wie sie hier zu finden sind: php.net/manual/de/ref.mbstring.php
Konkret könnt ihr euren gesamten Quelltext durchsuchen und folgende Funktionen ersetzen:
Quellcode
- mail() -> mb_send_mail()
- strlen() -> mb_strlen()
- strpos() -> mb_strpos()
- strrpos() -> mb_strrpos()
- substr() -> mb_substr()
- strtolower() -> mb_strtolower()
- strtoupper() -> mb_strtoupper()
- substr_count() -> mb_substr_count()
- ereg() -> mb_ereg()
- eregi() -> mb_eregi()
- ereg_replace() -> mb_ereg_replace()
- eregi_replace() -> mb_eregi_replace()
- split() -> mb_split()
Die Funktion htmlentities ignoriert den Zeichensatz per Default auch. Daher muss man ihr den dritten Funktionsparameter immer mitgeben:
== Content Type ==
Dateien haben eine Zeichenkodierung und Editoren speichern in dieser. Arbeiten mehrere Personen mit unterschiedlichen Zeichensätzen an der selben Datei kann dies fatale Auswirkungen haben. Daher sollte jeder seine Entwicklungsumgebung auf UTF-8 umstellen.
Bei HTTP Requests sollte dazu der Zeichensatz auch übertragen werden. Benutzt dazu das header Statement.
Damit der Client weiß welcher Zeichensatz ihn erwartet darf man auch die Meta-Angabe nicht vergessen:
== Datenbank Connection Encoding ==
Bei der Nutzung von PHP sollte man das Connection Encoding auf UTF-8 erzwingen.
== Literatur ==
9.490 mal gelesen