2010-12-16 15 views
1

Hintergrund: Es gibt eine Tabelle, Ereignisse; Diese Tabelle ist mit latin1 formatiert. Die einzelnen Spalten in dieser Tabelle sind auf utf8 eingestellt. Die Kolumne, die wir diskutieren werden, ist "Titel", was eine der utf8-Spalten ist. Die Website ist für utf8 sowohl über Apache als auch über das Meta-Tag eingestellt.php 5.2 + mysql 5.1 zeichencodierung ausgabe

Als Test, wenn ich décor or © in das Titelfeld speichern und ausführen

select title, LENGTH(title) as len, CHAR_LENGTH(title) as chlen 
from events where length(title) != char_length(title) 

Ich werde décor or ©, 12, 10 zurück als Ergebnis erhalten; was erwartet wird, dass die Daten tatsächlich korrekt in meiner utf8-Spalte gespeichert wurden.

Wenn ich jedoch den Titel auf eine Seite zurückgebe, ist es in d�cor or � manipuliert, was für mich keinen Sinn macht, da, wie bereits erwähnt, die Zeichencodierung auf utf-8 auf der Seite eingestellt ist.

Nicht sicher, ob dieses letzte Detail einen Unterschied macht, aber wenn ich die Seite bearbeite und den verstümmelten Text erneut übersetze, wird es in d%uFFFDcor or %uFFFD sowohl in der Datenbank als auch auf der Seite angezeigt. Weitere Eingaben bewirken keine Änderung.

Aktuelle Frage: Hat jemand eine Idee, was ich falsch machen könnte? :-P

Antwort

2

Nun, es gibt wahrscheinlich eines von drei Problemen.

1. Mysql die Verbindung nicht mit UTF-8

Das bedeutet, dass es auf eine andere charset umgewandelt ist (wahrscheinlich Latin-1), bevor es PHP trifft. Ich habe die beste Lösung gefunden, die folgenden Abfragen ausführen:

SET CHARACTER SET = "utf8"; 
SET character_set_database = "utf8"; 
SET character_set_connection = "utf8"; 
SET character_set_server = "utf8"; 

2. Die Seite kann nicht wirklich auf UTF-8

Set gerendert wird sowohl die Content-type Header und den <meta> Tages Inhaltstypen zu UTF-8. Einige Browser nicht respektieren das eine oder andere ...

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

echo '<meta http-equiv="content-type" content="text/html; charset=utf-8" />'; 

Wie in den Kommentaren erwähnt, das ist nicht das Problem ...

3. Sie etwas zu tun, zu der Zeichenkette vor dem Echo

Die meisten PHP-String-Funktionen werden nicht gut mit UTF-8. Wenn Sie eine normale Funktion aufrufen, die keinen $charset-Parameter akzeptiert, ist es wahrscheinlich, dass sie nicht mit utf-8-Strings arbeitet (wie str_replace). . Wenn es einen $charset Parameter hat (wie htmlspecialchars, stellen Sie sicher, dass Sie es einrichten

echo htmlspecialchars($content, ENT_COMPAT, 'UTF-8'); 
+0

nicht 2 sein kann, sonst würde es 2 aus Zeichen anstelle von 1 Ersetzungszeichen –

+0

@Ignacio. Guter Punkt ... werde ich entsprechend bearbeiten – ircmaxell

+0

Ich habe versucht, die bereitgestellten Abfragen in meinem Bootstrap-Prozess direkt nach dem Öffnen der Datenbankverbindung auszuführen, die Ergebnisse des Speicherns in der Datenbank sind jetzt: 'd? Cor oder?'und ich habe var_dump'd die Ergebnisse aus der db bevor alles andere ausgeführt werden konnte und es gibt keinen Unterschied. Danke für die Hilfe bis jetzt. :) – jdsmith2816