You are not logged in.

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.

1. 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.

2. 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.

3. Datenbank umstellen


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
	;


4. 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: 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:

PHP Quellcode

1
htmlentities($var, ENT_QUOTES, 'UTF-8')


5. 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.

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" />


6. Datenbank Connection Encoding


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");


7. Literatur



Lexikon 4.1.3, developed by www.viecode.com