This articles has been requested to be deleted.
Saturday, December 26th 2009, 2:08pm
Tags
ansi,
charset,
collation,
encoding,
kodierung,
stringfunktion,
unicode,
utf-8,
zeichensatz
Abstract
Wenn zwei Skripte kommunizieren (z.B. über AJAX), dann müssen Sie sich auf eine gemeinsame Sprache verständigen.
PHP 6 wird mit Version 6 viel in Sachen Unicode Kompatibilität lernen. Aber man sollte man immer strikte Regeln beachten.
Article
Dieser Beitrag muss noch weiter überarbeitet werden.
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.
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.
|
SQL Code
|
1
2
3
4
5
6
7
8
9
10
11
|
ALTER DATABASE db_name
CHARACTER SET utf8
DEFAULT CHARACTER SET utf8
COLLATE utf8_general_ci
DEFAULT COLLATE utf8_general_ci
;
ALTER TABLE tbl_name
DEFAULT CHARACTER SET utf8
COLLATE utf8_general_ci
;
|
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:
http://www.php.net/manual/de/ref.mbstring.php
Konkret könnt ihr euren gesamten Quelltext durchsuchen und folgende Funktionen ersetzen:
|
Source code
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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:
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.
|
PHP Quellcode
|
1
|
header('Content-type: text/html; charset=UTF-8') ;
|
Damit der Client weiß welcher Zeichensatz ihn erwartet darf man auch die Meta-Angabe nicht vergessen:
|
HTML Code
|
1
|
<meta http-equiv="Content-type" value="text/html; charset=UTF-8" />
|
Bei der Nutzung von PHP sollte man das Connection Encoding auf UTF-8 erzwingen.
|
PHP Quellcode
|
1
2
|
$dbh = new PDO('mysql:...');
$dbh->exec("SET NAMES utf8");
|
report critical content