Hi!
Was ja aber nicnht heißt, dass ein User sienen Browser trotzdem auf eine andere Zeichekodierung einstellt, oder?
Was hat er dann davon? Sabotieren kann immer jemand. Wenn jemand Mist machen will, hat er noch ganz andere Möglichkeiten als eine andere Zeichenkodierung zu verwenden. Vermutlich wird nur eine verschwindend geringer Teil seinen Browser unwissentlich falsch einstellen.
Die einzelnen Felder sind alle durch die Bank nach folgendem Schema aufgebaut:
int steht nichts dahinter,
decimal auch nicht,
timestamp nichts,
Die sind ja auch nicht von der Zeichenkodierung betroffen, weil es Zahlen und Zeitwerte sind.
char, varchar oder text sind latin1_germany1_ci
Passt denn der Inhalt zur Angabe? Zeigt phpMyAdmin alles (die Umlaute vor allem) richtig an?
In welcher Reihenfolge gehe ich nun vor, wenn ich absolut alles auf UTF-8 umstellen möchte?
1. Datensicherung.
2. Datenbankinhalt umkodieren, also jedes einzelne String-Feld. Wenn es nicht zu viele sind, mach es zu Fuß, ansonsten lass dir ALTER-TABLE-Statements erstellen. Zusätzlich kannst du noch die Angabe der Tabelle und die der Datenbank umstellen. Diese beiden Angaben sind nur dann wichtig, wenn du neue Felder beziehungsweise Tabellen erstellen willst und dabei keine Kollation/Kodierung angibst, denn dann wird die übergeordnete verwendet.
Bis hier hin kannst du alles mit dem phpMyAdmin machen oder kontrollieren. Den Teilweg zwischen DBMS und PHP kannst du schlecht prüfen, weil du zwecks Ausgabe üblicherweise den Teilweg zwischen PHP/Webserver und dem Browser benötigst.
3. Wenn du mit MySQL kommunizieren willst, müsst du festlegen, welche Kodierung dabei zu verwenden ist. Egal, wie die Daten in den Feldern kodiert sind, es zählt immer die für die jeweilige Verbindung eingestellte Kodierung. Bei Unterschieden kodiert MySQL selbständig um. Also, nach jedem mysql_connect (oder wenn du mysqli verwendest dessen Äquivalent) rufst du mysql_set_charset('utf8') auf (zum Nachlesen).
Ich kann die mysql-Konfiguration selber nicht beeinflussen, da sie beim Provider liegt.
Der legt nur die Default-Werte fest. Alles andere kannst du problemlos überschreiben. Im Falle der Verbindungskodierung solltest du das auch, denn wenn du dich auf den Defaultwert verlässt und sich dieser (warum auch immer) ändert, ...
4. Richtung Browser
- header?
- meta tag?
5. PHP-Code-Dateien müssen nicht zwangsläufig bearbeitet werden. Wenn du nur Code drin stehen hast, betrifft eine Umkodierung potentiell nur Kommentare. (In den Bezeichnern wirst du vermutlich nur ASCII-Zeichen verwendet haben, auch wenn Umlaute etc. erlaubt sind.) Wenn Texte enthalten sind, dann ergibt eine Konvertierung nur dann ein anderes Ergebnis, wenn Nicht-ASCII-Zeichen verwendet wurden - also alles jenseits von a-zA-Z0-9 und ein paar Satzzeichen.
6. PHP-Code. Wenn du die Daten nur vom DBMS zum Browser und wieder zurück durchreichst, ohne Stringverarbeitung anzuwenden, dann brauchst du nichts weiter zu machen. Ansonsten musst du schauen, dass du multibyte-fähige Funktionen findest und verwendest oder prüfen, ob die Funktion eine Kodierungsangabe als optionalen Parameter auswertet. htmlspecialchars() kannst du einfach so aufrufen, denn die von ihr behandelten Zeichen sind alle im ASCII-Bereich. Den Rest lässt diese Funktion unberührt. htmlentities() solltest du jedoch gegen htmlspecialchars() tauschen.
- was sonst noch?
Welche Komponenten sind an deinem Projekt noch beteiligt? Textdateien? Dateinamen? Andere Server? Mailversand?
Der Grundsatz lautet: Jeder beteiligte Prozess muss mit der Kodierung umgehen können - zwischen zwei Prozessen muss die zu verwendende Kodierung ausgehandelt werden, beziehungsweise dem Zielprozess muss sie mitgeteilt werden.
Und zu Punkt 3: Alle meine php-Dateien müssen ja auch auf UTF-8-Zeichenkodierung gespeichert werden.
Gibt es da ein Programm, was mir dabei hilft? Denn ich habe da etliche Dateien, die ich öffnen, speichern und wieder schließen müsste.
Die reine Konvertierung von Dateien geht beispielsweise mit iconv. Das ist ein Unix-Programm. Eine Windows-Version ist auf alle Fälle in Cygwin enthalten. Ob es weitere Massentools gibt, weiß ich nicht. (recode unter Linux/Unix gibt es auch noch, sollte jedoch zugunsten von iconv nicht verwendet werden. iconv ist der Nachfolger, ist umfangreicher, und zu recode las ich irgendwann mal eine Warnung.)
Lo!