1
Hallo, ich bin neu hier und möchte mich gleich mit einem großen Problem an euch wenden, ich hoffe das macht keinen schlechten Eindruck :)
Ich habe vor kurzem beschlossen meine Webseite von ISO-8859-1 Zeichenkodierung auf UTF-8 umzustellen, und ebenso auch meine Mysql Datenbank aus der die Webseite einige Inhalte dynamisch erstellt (die Datenbank besteht aus ein paar Tabellen mit der Kollation Latin1_general_ci und diese Daten habe ich allesamt über Eingabeformulare auf meiner Webseite gefüllt d.h. sie kamen schon von der Webseite im ISO-8859-1 Format). Dabei bin ich nun auf ein paar Probleme gestoßen die ich mit meinem mangelnden Wissen nicht mal lokalisieren kann, ich habe aber ein Datenbankbackup und habe daher ein bisschen herrumexperimentiert. Aber nun erstmal zu meinem konkreten Problem:
Mein erster Schritt in der Umstellung der Webseite war: die einzelnen Webseiten als UTF-8 abzuspeichern (ohne BOM, wegen SESSION/Header Problemen). Desweiteren habe ich auch in den Meta-Tags den neuen charset eingestellt damit die Seite auch richtig angezeigt wird (und der Browser erkennt auch UTF-8 als Charset bzw. benutzt es). Zuerst ist mir dann natürlich aufgefallen das die Webseite an den Stellen an welchen Textinhalte aus der Mysql-Datenbank angezeigt wurden teilweise Fehler aufwies, also im speziellen wurden deutsche Umlaute durch einfache "?" ersetzt (jedes Zeichen das nicht dargestellt werden konnte wurde durch so ein Fragezeichen ersetzt) auch im Quellcode, eine testweise, temporäre, manuelle Umstellung der Zeichenkonvertierung im Browser (ich benutzte FireFox, da geht das über "Ansicht") auf ISO-8859-1 sorgte wieder für eine korrekte Darstellung dieser "?". Ich vermutete das diese fehlerhafte Darstellung darauf zurückzuführen ist das die Datenbank die Inhalte nicht um UTF-8 Format enthält also dachte ich mir das es wohl das Sinnvollste wäre die Datenbank bzw. die Inhalte zu konvertieren, aber bevor ich dies versuchte habe, habe ich zum Testen nocheinmal versucht einen dieser Textinhalte aus der Datenbank über eben so ein Formular über welches ich es ursprünglich in die Datenbank gebracht habe, zu editieren, ich habe also den Text bearbeitet und siehe da, scheinbar wurde dieser bearbeitete String dann im UTF-8 Format abgespeichert (vermutlich weil die Seite ja jetzt eine UTF-8 Datei war). Alle anderen Strings konnten zwar noch immer nicht vernüpftig dargestellt werden aber dieser Eine war ok, nur dachte ich mir das es wenig bringt jetzt jeden Inhalt auf diese Weise zu konvertieren da es ewig dauern würde (außerdem habe die Tabellen ja noch die Kollation Latin1_general_ci und ich will ja utf8_unicode_ci, ich verstehe zwar nicht wieso es auch so klappt aber ich will lieber sicher gehen).
Deshalb habe ich eine der Datenbank-Tabellen mit phpMyAdmin exportiert (in eine Reihe SQL Anweisungen: ein Table Create und diverse Inserts) habe dann diese eine Tabelle gelöscht und neu angelegt und zwar diesmal so das ich alle Kollationen auf utf8_unicode_ci gestellt habe, dann habe ich mir die exportieren Inserts vorgenommen und in einer UTF-8 Datei gespeichert (um sie zu konvertieren). Diese Datei habe ich dann über die Importfunktion von phpMyAdmin benutzt um die Tabelle wieder zu füllen (habe auch angegeben das die Datei UTF-8 ist). So nun müsste diese Tabelle doch eigentlich UTF-8 enthalten oder nicht?
Jedenfalls brachte dies Überhaupt nichts, die Inhalte wurden trotzdem genauso "?"-behaftet angezeigt wie vorher.
So dieses Problem hat erstmal dafür gesorgt das ich mich 2 Tage lange Abends in den Schlaf geweint habe, bis ich vor kurzem von diesem Mysql Befehl erfahren habe: SET NAMES 'utf-8'
wenn man dieses vor der Kommunikation mit der Datenbank aufruft dann sollte die gesammte Kommunikation in UTF-8 ablaufen, also die Datenbank erwartet vom Client UTF-8 und sendet selbst auch so. Und dies brachte in der Tat einen ersten Erfolg (ich brachte so einen Query nämlich im Konstruktor meiner Mysql Klasse unter) nämlich wurden auf einmal sämtliche Datenbankinhalte auf der UTF-8 Webseite völlig Fehlerfrei angezeigt, sowohl die ganzen alten Tabellen als auch diese eine neue die ich schon wie oben beschrieben ins UTF-8 konvertiert hatte (obwohl ich mir nicht sicher bin ob meine Methode überhaupt für eine Konvertierung gesorgt hat, ich weiß ja nicht wie ich das Nachprüfen kann). Nur einen großen Haken hatte die Sache: sämtliche neuen oder bearbeiteten Inhalte (über die Formulare auf der Webseite) werden nun nicht vernüpftig in der Datenbank gespeichert (egal ob sie in der neuen konvertieren Tabelle oder in den alten abgelegt werden), die deutschen Umlaute werden, in der Tabelle gespeichert und zwar so das die Umlaute und einige Sonderzeichen durch ein bis zu 3 Zeichen langes cryptisches Etwas ersetzt werden, sowohl in phpMyAdmin als auch auf der Webseite, wenn die Daten wieder ausgelesen werden, sieht es zumindest gleich cryptisch aus. Nur ist es diesmal so, das ein Manuelles wechseln der Zeichenkodierung im Browser alles nur schlimmer machte, also keine andere Kodierung sorgte auch nur für eine bessere Darstellung.
Wie man sieht hat SET NAMES 'utf-8' das Problem jetzt umgekehrt: vorher wurden die alten Daten falsch angezeigt, egal ob konvertiert oder nicht, dafür aber die neuen korrekt und jetzt werden die alten Daten, egal ob konvertiert oder nicht, korrekt angezeigt, aber die neuen werden noch kryptischer.
So das ist mein Problem, ich hoffe das ich hier einen Profi finde der mir sagen kann wo das Problem liegen könnte, und mir nebenbei vieleicht noch sagt ob mein beschriebener Umkodierungsversucht den ich oben für eine Tabelle testweise durchgeführt habe, korrekt war oder ob er nichts geändert hat.
Wenn mir jemand helfen kann, dann wäre ich unendlich glücklich da meine Webseite nun schon einige Zeit lang offline ist und ich kurz vor dem Nervenzusammenbruch stehe.
Ich habe vor kurzem beschlossen meine Webseite von ISO-8859-1 Zeichenkodierung auf UTF-8 umzustellen, und ebenso auch meine Mysql Datenbank aus der die Webseite einige Inhalte dynamisch erstellt (die Datenbank besteht aus ein paar Tabellen mit der Kollation Latin1_general_ci und diese Daten habe ich allesamt über Eingabeformulare auf meiner Webseite gefüllt d.h. sie kamen schon von der Webseite im ISO-8859-1 Format). Dabei bin ich nun auf ein paar Probleme gestoßen die ich mit meinem mangelnden Wissen nicht mal lokalisieren kann, ich habe aber ein Datenbankbackup und habe daher ein bisschen herrumexperimentiert. Aber nun erstmal zu meinem konkreten Problem:
Mein erster Schritt in der Umstellung der Webseite war: die einzelnen Webseiten als UTF-8 abzuspeichern (ohne BOM, wegen SESSION/Header Problemen). Desweiteren habe ich auch in den Meta-Tags den neuen charset eingestellt damit die Seite auch richtig angezeigt wird (und der Browser erkennt auch UTF-8 als Charset bzw. benutzt es). Zuerst ist mir dann natürlich aufgefallen das die Webseite an den Stellen an welchen Textinhalte aus der Mysql-Datenbank angezeigt wurden teilweise Fehler aufwies, also im speziellen wurden deutsche Umlaute durch einfache "?" ersetzt (jedes Zeichen das nicht dargestellt werden konnte wurde durch so ein Fragezeichen ersetzt) auch im Quellcode, eine testweise, temporäre, manuelle Umstellung der Zeichenkonvertierung im Browser (ich benutzte FireFox, da geht das über "Ansicht") auf ISO-8859-1 sorgte wieder für eine korrekte Darstellung dieser "?". Ich vermutete das diese fehlerhafte Darstellung darauf zurückzuführen ist das die Datenbank die Inhalte nicht um UTF-8 Format enthält also dachte ich mir das es wohl das Sinnvollste wäre die Datenbank bzw. die Inhalte zu konvertieren, aber bevor ich dies versuchte habe, habe ich zum Testen nocheinmal versucht einen dieser Textinhalte aus der Datenbank über eben so ein Formular über welches ich es ursprünglich in die Datenbank gebracht habe, zu editieren, ich habe also den Text bearbeitet und siehe da, scheinbar wurde dieser bearbeitete String dann im UTF-8 Format abgespeichert (vermutlich weil die Seite ja jetzt eine UTF-8 Datei war). Alle anderen Strings konnten zwar noch immer nicht vernüpftig dargestellt werden aber dieser Eine war ok, nur dachte ich mir das es wenig bringt jetzt jeden Inhalt auf diese Weise zu konvertieren da es ewig dauern würde (außerdem habe die Tabellen ja noch die Kollation Latin1_general_ci und ich will ja utf8_unicode_ci, ich verstehe zwar nicht wieso es auch so klappt aber ich will lieber sicher gehen).
Deshalb habe ich eine der Datenbank-Tabellen mit phpMyAdmin exportiert (in eine Reihe SQL Anweisungen: ein Table Create und diverse Inserts) habe dann diese eine Tabelle gelöscht und neu angelegt und zwar diesmal so das ich alle Kollationen auf utf8_unicode_ci gestellt habe, dann habe ich mir die exportieren Inserts vorgenommen und in einer UTF-8 Datei gespeichert (um sie zu konvertieren). Diese Datei habe ich dann über die Importfunktion von phpMyAdmin benutzt um die Tabelle wieder zu füllen (habe auch angegeben das die Datei UTF-8 ist). So nun müsste diese Tabelle doch eigentlich UTF-8 enthalten oder nicht?
Jedenfalls brachte dies Überhaupt nichts, die Inhalte wurden trotzdem genauso "?"-behaftet angezeigt wie vorher.
So dieses Problem hat erstmal dafür gesorgt das ich mich 2 Tage lange Abends in den Schlaf geweint habe, bis ich vor kurzem von diesem Mysql Befehl erfahren habe: SET NAMES 'utf-8'
wenn man dieses vor der Kommunikation mit der Datenbank aufruft dann sollte die gesammte Kommunikation in UTF-8 ablaufen, also die Datenbank erwartet vom Client UTF-8 und sendet selbst auch so. Und dies brachte in der Tat einen ersten Erfolg (ich brachte so einen Query nämlich im Konstruktor meiner Mysql Klasse unter) nämlich wurden auf einmal sämtliche Datenbankinhalte auf der UTF-8 Webseite völlig Fehlerfrei angezeigt, sowohl die ganzen alten Tabellen als auch diese eine neue die ich schon wie oben beschrieben ins UTF-8 konvertiert hatte (obwohl ich mir nicht sicher bin ob meine Methode überhaupt für eine Konvertierung gesorgt hat, ich weiß ja nicht wie ich das Nachprüfen kann). Nur einen großen Haken hatte die Sache: sämtliche neuen oder bearbeiteten Inhalte (über die Formulare auf der Webseite) werden nun nicht vernüpftig in der Datenbank gespeichert (egal ob sie in der neuen konvertieren Tabelle oder in den alten abgelegt werden), die deutschen Umlaute werden, in der Tabelle gespeichert und zwar so das die Umlaute und einige Sonderzeichen durch ein bis zu 3 Zeichen langes cryptisches Etwas ersetzt werden, sowohl in phpMyAdmin als auch auf der Webseite, wenn die Daten wieder ausgelesen werden, sieht es zumindest gleich cryptisch aus. Nur ist es diesmal so, das ein Manuelles wechseln der Zeichenkodierung im Browser alles nur schlimmer machte, also keine andere Kodierung sorgte auch nur für eine bessere Darstellung.
Wie man sieht hat SET NAMES 'utf-8' das Problem jetzt umgekehrt: vorher wurden die alten Daten falsch angezeigt, egal ob konvertiert oder nicht, dafür aber die neuen korrekt und jetzt werden die alten Daten, egal ob konvertiert oder nicht, korrekt angezeigt, aber die neuen werden noch kryptischer.
So das ist mein Problem, ich hoffe das ich hier einen Profi finde der mir sagen kann wo das Problem liegen könnte, und mir nebenbei vieleicht noch sagt ob mein beschriebener Umkodierungsversucht den ich oben für eine Tabelle testweise durchgeführt habe, korrekt war oder ob er nichts geändert hat.
Wenn mir jemand helfen kann, dann wäre ich unendlich glücklich da meine Webseite nun schon einige Zeit lang offline ist und ich kurz vor dem Nervenzusammenbruch stehe.