echo $begrüßung;
Dabei sollen die Daten nach charset utf-8 verarbeitet werden.
Dies sage ich der Seite mit:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Nein, damit sagst du dem Browser, dass die Daten der Seite UTF-8-kodiert seien, falls es im gleichnamigen HTTP-Header keine charset-Angabe gibt, denn diese wäre verbindlicher als die Meta-Angabe.
Du musst dich an diese Angabe dann auch halten, ansonsten fehlinterpretiert der Browser die Byte-Werte.
$BENUTZER_NAME = $_POST['BENUTZER_NAME'];
$BENUTZER_NAME = addslashes(htmlspecialchars(trim($BENUTZER_NAME)));
$BENUTZER_NAME = ucfirst(strtolower($BENUTZER_NAME));
trim() ist ok. strtolower() und ucfirst() kann man gelten lassen, wenn es mir auch nicht gefallen würde. Aber addslashes() ist für MySQL eine unzureichende Maßnahme, weil damit nicht alle MySQL-Sonderzeichen berücksichtigt werden. mysql_real_escape_string() solltest du stattdessen anwenden, und das auch erst zu dem Zeitpunkt, wenn du das SQL-Statement erzeugst. Andere String-Bearbeitungsschritte haben danach nichts mehr zu suchen. htmlspecialchars() ist der völlig falsche Zeitpunkt. Daten müssen erst dann HTML-gerecht aufbereitet werden, wenn du sie in einen HTML-Kontext ausgibst. In der Datenbank haben HTML-Maskierungen nichts verloren. Sie behindern nur die Anwendung von Stringfunktionen und Sortierungen und stören auch, wenn die Daten mal in einen anderen Kontext als HTML überführt werden sollen.
Die daten werden danach in die Datenbank geschrieben.
Vermutlich hast du dabei, wie so viele Fragende mit ähnlichen Problemen, nicht beachtet, dem Server mitzuteilen, in welcher Kodierung du dich mit ihm unterhalten möchtest. Dieser Schritt ist so wichtig, dass er bereits auf der Einstiegsseite des MySQL-Handbuchkapitels Character Set Support erwähnt wird. (Stichwort SET NAMES)
Die 'Kollation' der datenbankspalte in die der Benutzernamen geschrieben wird ist 'latin1_general_ci'
Warum dies? Damit kannst du nur die 256 Latin1-Zeichen speichern, aber nicht den kompletten Umfang von UTF-8.
Nun ein Beispiel anhand eines Namens mit umlauten oder Sonderzeichen:
In der Datenbank steht nun 'Kã¤rstin' statt 'Kärstin'
Das sieht so aus, als ob der Server von einer Default-Einstellung für Client-Server-Verbindungen von Latin1 ausgeht, du ihm aber UTF-8 sendest. Er betrachtet dann die zwei Bytes eines UTF-8-kodierten ä als zwei Latin1-Zeichen.
Nach dem auslesen der Daten aus der DB (diese werden nicht nochmals umgewandelt oder auf Sonderzeichen etc überprüft) steht nun im Quelltext: 'K�rstin' aber ich möchte haben das dort Kärstin steht.
Entities (ä) oder numerische Zeichenreferenzen (NCR) (ä) brauchst du nicht mehr, denn mit UTF-8 können diese Zeichen direkt verwendet werden. Das � deutet darauf hin, dass der Browser UTF-8 erwartet, aber keine gültige UTF-8-Sequenz erhält, z.B. weil ein Latin1-ä ausgeliefert wird. Mir scheint, hier hast du doch irgendwo eine Konvertierung nach Latin1 drin.
Muss ich statt 'htmlspecialchars' 'htmlentities' benutzen?
Für eine Ausgabe im HTML-Kontext reicht es, htmlspecialchars() zu benutzen. HTML-Entities oder NCR brauchst du nur dann, wenn du Zeichen verwendest, die in der gewählten Kodierung nicht vorkommen, was aber bei UTF-8 nicht der Fall sein kann.
Muss ich für die Datenbank eine andere 'Kollation' benutzen?
Es ist empfehlenswert, eine UTF-8-Kollation zu verwenden, wenn du keinen Zeichenverlust haben möchtest. Wenn die Datenbank UTF-8-kodierte Zeichen bekommt, die mit Latin1 nicht darstellbar sind, kann MySQL daraus nur ein ? machen.
Muss ich PHP nochmal speziell sagen das es nach utf-8 umwandeln soll?
Wenn du in Richtung Browser und in Richtung Datenbank UTF-8 sprichst, muss PHP nur noch durchreichen (Kontextabhängige Maskierungen dabei nicht vergessen!).
Es gibt sicherlich viele Fragen die ähnlich sind wie meine nur konnte mir bisher kein Ergebnis welches ich in Foren gefunden hatte weiterhelfen.
Das glaube ich eher nicht, oder du hast das Archiv dieses Forums ausgelassen. Denn dann müsste ich in der Vergangenheit zu oft solche Fragen unverständlich beantwortet haben. :-)
echo "$verabschiedung $name";