Tach!
Also, ich fasse nochmal detailiert zusammen, was wann wie und wo gespeichert bzw. mit der Variable gemacht wird:
Das war ja schon in deinem Ausgangsposting einigermaßen klar. Welchen von den Hinweisen bist du bereits nachgegangen und was für ein Ergebnis hast du bekommen?
1.) die Dateneingabe vom User durchläuft htmlspecialchars()
Das ist Unsinn, wie schon gesagt. htmlspecialchars() ist für die Ausgabe und nicht für die Eingabedaten vorgesehen. Aber viel interessanter wäre, wie das aussieht, was vom Anwender kommt. An dieser Stelle, so meine Vermutung, sind die Zeichen bereits verunstaltet.
2.) die Dateneingabe wird in meiner Datenbank MySql(V5.1.61) in einem Longtext utf8_unicode gespeichert
Davor fehlt noch, ob die Zeichenkodierung mit dem MySQL-Server ausgehandelt wurde. Bis jetzt hast du anscheinend nur gesagt, wie die Daten abgelegt werden sollen, aber nicht mitgeteilt, in welcher Kodierung sie übergeben werden.
3.) Zur Anzeige wird der Browser mit <meta http-equiv="content-type" content="text/html; charset=UTF-8"> gestartet
Der Browser läuft schon. Du deklarierst damitl lediglich die Zeichenkodierung des Dokuments - falls der Webserver das nicht bereits in einem HTTP-Header getan hat, denn diese Meta-Angabe ist nur ein Ersatz dafür. Bitte prüf das mit einem Tool, das die HTTP-Header anzeigen kann, beispielsweise die livehttpheaders-Extension für den Firefox.
Was ist mit der Seite, die das Eingabeformular enthält? Prüf diese bitte auch an beiden Stellen: Meta-Angabe und HTTP-Headers.
4.) Nachdem das Datenbankfeld ausgelesen wurde, durchläuft die Variable zunächst htmlentities() und anschließend nl2br() und wird dann ausgegegeben.
htmlentities() ist bei UTF-8 nicht notwendig. Lediglich htmlspecialchars() musst du anwenden. Und zwar hier bei der Ausgabe und nicht bei den Eingabedaten.
[Folgender Text wird vom User eingegeben:]
Doğal Tıp | Psikolojik Danışmanlık
[Folgendes steht dann in der Datenbank:]
Do&#287;al T&#305;p | Psikolojik Dan&#305;&#351;manl&#305;k
Das war das falsch verwendete htmlspecialchars(), das hat die & der NCRs zu & gemacht. Wie schaust du dir eigentlich an, was in der Datenbank steht? Die ist schließlich eine Art Blackbox. Wie stellst du sicher, dass nicht beim Auslesen irgendwelche Umkodierungen gleich welcher Art vorgenommen werden?
[Beim auslesen steht im Quelltext des Browsers:]
Do&amp;#287;al T&amp;#305;p | Psikolojik Dan&amp;#305;&amp;#351;manl&amp;#305;k
Das war das htmlentities(), das hat die & von den & zu & gemacht, woraus sich &amp;NCR; ergibt.
[Und folgendes wird im Browser ausgegeben:]
Do&#287;al T&#305;p | Psikolojik Dan&#305;&#351;manl&#305;k
Klar, der interpretiert das & richtig und gibt den Rest aus.
Die Ausgabe ist also nicht identisch mit der Eingabe.
Aus Sicht der Scriptverarbeitung (Eingabe zum DBMS und DBMS zum Browser) hast du ja auch einmal falsch HTML-kodiert. Ansonsten würdest du genau das sehen, was das Script als Eingabedaten gesehen hat.
Wo liegt nun der Fehler, beim speichern oder beim ausgeben?
Davor - vermutlich.
Und die viel wichtigere Frage: Wie mache ich es richtig?
Das hab ich doch schon verlinkt.
dedlfix.