Tach!
In der Datenbank werden die Umlaute html-codiert geschrieben. Beim wiedereinlesen der Daten hat sich die Kodierung geändert.
Das, hat ja Encoder schon gesagt, ist Unsinn.
In der Datenbank steht: weiß
Beim eingelesen steht dann im Warenkorb: Wei�
Das passt nicht. Da fehlt ein Zwischenschritt, der aus dem Entity wieder ein Zeichen macht. Mit dem Entity bekommst du in keinem Fall einen Zeichensalat - was nicht heißt, dass Entitys und NCRs die Lösung aller Probleme seien.
Andere Vermutung: da steht doch ein richtiges ß in dem fraglichen Datensatz (oder auch ein falsch kodiertes, aber kein Eintity).
(1) Die Kollation aller Tabellen steht auf "utf8_general_ci" ebenso die Kollation der Zeichensatz / Kollation der MySQL-Verbindung.
Das ist nicht weiter wichtig. Es zählt das, was für das jeweilige Feld eingestellt ist. Siehe http://wiki.selfhtml.org/wiki/Themen:Zeichencodierung/MySQL.
(2) alle php-Dateien sind als utf-8 codiert/gespeichert
Ist nur von Bedeutung, wenn darin Texte/Strings stehen.
(3) <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Diese Angabe hat nur den zweiten Rang. Siehe http://wiki.selfhtml.org/wiki/Themen:Zeichencodierung/Webdokumente und auch http://wiki.selfhtml.org/wiki/Themen:Zeichencodierung/Webserver
Wieso bekomme ich so einen "Umlautsalat"?
Dir fehlt vielleicht die Angabe wie zwischen PHP und MySQL kodiert werden soll. Siehe erster Link.
Wichtig sind immer zwei Dinge: Jedes System muss mit der Kodierung umgehen können, es sei denn, es ist nur Durchreicher. Zwischen zwei Systemen muss definiert sein, wie die Daten übertragen werden. Gegebenenfalls ist das auszuhandeln oder einfach nur anzugeben.
Demzufolge reicht es nicht, nur das Feld zu konfigurieren, denn das erfüllt nur die erste Bedingung. Die zweite Bedingung wird erfüllt ... siehe erster Link. Erfüll erstmal beide Bedingungen für alle beteiligten Systeme (Datenbank, Webserver, Browser). Wenn dann noch Fehler auftreten, sind deine Daten kaputt.
dedlfix.