Ihr Browser des Benutzers Daten einreichen, die UTF-8 codiert sind, aber Sie mit einer Datenbank verbinden, die Sie 1) setzt voraus, übermitteln latin1-codierte Daten 2) speichert Ihre Daten als latin1-codierte Strings. Ihre Daten werden daher falsch codiert gespeichert.
Wenn Sie Daten aus der Datenbank abrufen, werden sie als latin1-Strings bereitgestellt, aber da die latin1-Strings nur falsch codierte UTF-8 sind und PHP naiv alle Strings als binäre Strings behandelt, haben Sie nur Ihren ursprünglichen UTF- 8 String wieder zurück. Wenn Sie diese Zeichenfolge auf einer HTML-Seite wiedergeben, die wiederum als UTF-8-codiert deklariert ist, wird die Zeichenfolge so angezeigt, wie sie vom Benutzer gesendet wurde.
Wenn Sie jedoch den Inhalt der Datenbank mit einer Software betrachten, die sich mit der Behandlung von Zeichensätzen von MySQL auskennt, identifiziert diese Software die Spaltenzeichensätze als latin1 und stellt sicher, dass die angezeigten Zeichen die Zeichen sind der latin1-Zeichenfolge, die, wie wir bemerkten, falsch codierte UTF-8 war. Sie sehen daher falsch codierte Daten.
Es gibt eine Reihe von Schritten, die Sie ergreifen sollten, um dies zu beheben. Zunächst erwarten Sie, UTF-8-kodierte Daten (wie auf der HTML-Ebene deklariert) zu behandeln. Sie sollten also sicherstellen, dass Sie auf diese Weise auch mit MySQL kommunizieren. Sie tun dies, indem Sie immer SET NAMES 'utf8'
absetzen, wenn Sie eine Verbindung zur Datenbank herstellen. (Hinweis: Ihre Datenbank API kann eine spezielle Funktion zum Ändern eines Verbindungszeichensatzes bieten. Ich denke, die mysql
API nicht, aber ich bin mir nicht sicher.)
Zweitens sollten Sie sicherstellen, dass Sie Ihre speichern Daten UTF-8 codiert. Das bedeutet, dass die Zeichensätze Ihrer Datenbankspalten utf8
sein sollten. Ein Spaltenzeichensatz kann mit der Anweisung ALTER TABLE ... MODIFY
geändert werden. Vergessen Sie nicht, auch den Standard-Zeichensatz der Tabelle zu ändern (dadurch wird der Zeichensatz für neue Spalten festgelegt, die der Tabelle hinzugefügt wurden, für die Sie nicht explizit einen Zeichensatz angeben). Und ändern Sie den Datenbank-Zeichensatz, während Sie gerade dabei sind.
Wenn Sie jedoch einen Spaltenzeichensatz ändern, geht MySQL davon aus, dass die in den Zeilen dieser Tabelle bereits gespeicherten Daten nicht falsch codiert sind, sondern gültige Daten im alten Zeichensatz. Es konvertiert daher Ihre falsch codierten UTF-8-Daten (die als latin1-codierte Daten behandelt werden) in UTF-8-codierte Daten, so dass Sie mit doppelt UTF-8-kodierten Daten arbeiten. Es gibt einen Trick, um dies zu umgehen: Zuerst den Spaltenzeichensatz in den Zeichensatz binary
und dann von binary
in utf8
konvertieren. Auf diese Weise ändert MySQL die binäre Form der Daten nicht, weil Sie es über ein Format konvertieren, in dem es als beliebige binäre Zeichenfolgen behandelt wird.
Viel Glück!
Welche Zeichencodierung verwenden Sie in Ihrer Datenbank, für die Verbindung und für die Ausgabe? – Gumbo
Ist dies DEFAULT CHARSET = latin1; – dotty
Wir können das nicht rückgängig machen, ohne zu wissen, welches Gebietsschema/welcher Zeichensatz verwendet wurde. – stillstanding