Moin!
Folgendes habe ich bereits gemacht:
- Der Server ist auf UTF-8 kodiert.
- Der Header der Seite ebenso.
- Die Forms besitzen accept-charset="utf-8"
- Innerhalb der PHP-Dateien ist die Codierung richtig.
Wenn du vollkommen UTF-8-verarbeitungsfähig bist, dann entfallen einige deiner Schritte - weil sie schlicht und ergreifend überflüssig sind, dir aber deine Texte kaputtmachen!
- Umwandeln des €-Zeichens von URI auf UTF8
Diese Umwandlung mach PHP schon automatisch für dich, die mußt du nicht noch extra einbauen. Denn würdest du ein ganz normales Formular abschicken, würde der Browser selbständig das URI-Encoding mit den Daten durchführen - und bekanntermaßen macht PHP diese Transportsicherung ja auch selbständig rückgängig.
Zweitens behandelst du das Eurozeichen aus irgendeinem Grund hier gesondert. Warum? Es ist ein UTF-8-Zeichen wie jedes andere Zeichen auch (also auch wie das Alphabet "A-Z", die Umlaute, etc.). Der Extraweg str_replace() für das Eurozeichen und rawurldecode() für den Rest ist überflüssig.
Drittens wolltest du ja intern alle Strings als UTF-8 behandeln. Warum konvertierst du dann den String mit utf8_decode() in ISO-8859-1? In diesem Encoding gibt es kein Eurozeichen! Eventuell nur durch die Sonderbehandlung vorher wird etwas, das in dem gewählten Encoding kein Eurozeichen ist, unter besonderen Umständen evtl. von deinen Sonderfunktionen doch für eines gehalten. Es ist aber schwachsinnig, irgendeine Krücke mit ISO-8859-1 aufzubauen, wenn man die ganze Kiste viel einfacher haben könnte, wenn man durchgehens UTF-8 benutzen könnte.
foreach ($_REQUEST as $key => &$value )
{
if (is_string ($value))
{
// Convert the Euro symbol
$value = str_replace('%E2%82%AC', '€', $value);
$value = rawurldecode($value);
$value = utf8_decode($value);
}
}
> 4. Speicherung Datenbank ==> € funktioniert
Wenn du auf Schritt 3 verzichten und in Schritt 4 der Datenbank sagen würdest, a) dass die zu speichernden Strings in UTF-8 abzulegen sind (Kollation), und b) dass die Datenkommunikation mit der DB auch in UTF-8 funktioniert (Query "SET NAMES utf8"), würde dieser Schritt wirklich verläßlich funktionieren.
> So jetzt der Umgekehrte Weg
> 1. Abruf der Daten
> 2. Umwandeln des € auf HTML-Entity
Wenn du in der DB UTF-8-Daten stehen hast, kannst du auf die Umwandlung in Entities komplett verzichten und brauchst nur das Escaping für die HTML-Zeichen <, > und & durchzuführen mit htmlspecialchars().
Dein zweiter Fehler ist, dass du die falsche numerische Zeichenreferenz benutzt. Das Eurozeichen ist in der Unicode-Zeichentabelle nicht an Position 128, sondern an Position 8364.
> ~~~php
> function confirmeentities($mixText)
> {
> if(is_array($mixText) || is_object($mixText))
> {
> foreach($mixText as $key => &$value)
> {
> $value = confirmeentities($value);
> }
> }
> else
> {
> $mixText = str_replace('€', '€', $mixText);
> }
> return $mixText;
> }
>
- Umwandeln bei FORM-Feldern mit
htmlentities($strText, ENT_QUOTES);
Diese Umwandlung erfolgt mit der falschen Funktion, und sie muß immer erfolgen, solange du nicht definiert hast, dass in der Datenbank HTML-Quelltext drinsteht (d.h. eventuell dort gespeicherte HTML-Tags wirksam werden sollen als Formatierung).
- Darstellung des € im Frontend als Symbol ein Quardrat mit zwei 00 und ner 80 drin. Wenn ich dieses Zeichen wieder abgespeicht und wird es als € wiedererkannt und gespeichert.
Dieser seltsame Zirkelschluß kommt daher, dass das Encoding Windows-1252 das Eurozeichen an Position 128 definiert hat. Da Windows-1252 ansonsten aber nahezu identisch mit ISO-8859-1 ist, wird irgendeine Komponente (sei es Browser oder Editor) vermutlich mal eine automatische Erkennung durchführen und das verhunzte Unicode-Euro in ein korrektes Windows-1252-Euro umwandeln.
Als HTML-entity kann ich es leider nicht ausgeben, da es ja um FORM-Felder handelt.
Doch, das würde dir auch helfen - aber nur sehr am Rande. Alle Attributwerte von HTML-Feldern erlauben den Einsatz von Entities, "€" im value würde korrekt als Eurozeichen wiedergegeben werden. Aber da du in deiner Verarbeitungskette sowieso massive Fehler hast, die sich jetzt nur anhand des Eurozeichens zeigen, aber vermutlich noch in diversen anderen, bislang nicht beachteten Fällen zum Tragen kämen, solltest du deine seltsame Verarbeitungsweise lieber direkt auf 100% UTF-8 umstellen. Es macht dir später deutlich weniger Kopfschmerz.
Also evlt. kann mir einer einen Tipp geben, wie ich dieses "piep"-Zeichen herbekomm
Das Zeichen "BEL" trägt in vielen Encodings die Codenummer 8. Allerdings ist nicht gesagt, dass der Computer dann auch piept.
- Sven Rautenberg
"Love your nation - respect the others."