Euro Zeichen wird nicht erkannt.
Erich Heidenreich
- php
Guten Tag,
ich habe folgendes Problem: ich arbeite gerade an einer Benutzeranmeldung, bei der ich kein Eurozeichen zulassen will. Allerdings kommt am Server scheinbar kein Eurozeichen sondern dieses Zeichen an: ¤
Was ist da los? Ich habe momentan iso-8859-15 als Zeichensatz im HTML Quelltext definiert. Ich habe es auch schon mit 8859-1 und windows-1252 probiert, wobei jedes Mal dasselbe herauskam.
Ich muss aber noch betonen, dass hier noch keine Datenbank im Spiel ist, sondern dass ich nur zb. den Text €uro in einem Formular abschicke und mir dann ausgeben lasse, worauf ¤uro herauskommt. Ich weiß jetzt wirklich nicht mehr weiter. Wie wird das Eurozeichenproblem denn in diesem Forum gelöst?
Ihr Erich Heidenreich
你好 Erich,
ich habe folgendes Problem: ich arbeite gerade an einer Benutzeranmeldung,
bei der ich kein Eurozeichen zulassen will. Allerdings kommt am Server
scheinbar kein Eurozeichen sondern dieses Zeichen an: ¤
Was ist da los? Ich habe momentan iso-8859-15 als Zeichensatz im HTML
Quelltext definiert. Ich habe es auch schon mit 8859-1 und windows-1252
probiert, wobei jedes Mal dasselbe herauskam.
Sicher, dass du dem Browser wirklich gesagt hast, dass du ISO-8859-15
benutzen moechtest? Denke daran, dass HTTP-Header meta-Definitonen
ueberschreiben. PHP hat z. B. per default ISO-8859-1 als Charset
definiert -- und danach sieht es aktuell aus (in ISO-8859-15 ist die
Codierung, die bei ISO-8859-1 der Thorn (¤) ist, das Euro-Zeichen (€)).
Gehe also am besten per header() sicher, dass der richtige Charset
vermittelt wird (z. B. header("Content-Type: text/html; charset=ISO-8895-15");
再见,
CK
Guten Tag,
ich habe das jetzt noch zusätzlich mit dem header gemacht, trotzdem bleibt das Ergebnis dasselbe. Das ist wirklich schon sehr mysteriös. Kann es sein, dass vielleicht noch PHP intern ein anderer Zeichensatz verwendet wird?
Erich Heidenreich
你好 Erich,
ich habe das jetzt noch zusätzlich mit dem header gemacht, trotzdem bleibt
das Ergebnis dasselbe. Das ist wirklich schon sehr mysteriös. Kann es
sein, dass vielleicht noch PHP intern ein anderer Zeichensatz verwendet
wird?
PHP arbeitet nicht mit einem “Zeichensatz”. PHP kennt nur Bytes, und die
gibt es aus.
Aber whatever, du solltest so langsam mal etwas konkreter werden. Beispiele
waeren langsam angebracht, veroeffentliche dein Problem mal.
再见,
CK
Tut mir leid, habe ich vergessen. Hier kann man sich das Beispiel ansehen: http://www.alieneye.net/testboard/signup.php
Ich habe auch gerade gesehen, dass hier im Forum iso-8859-1 benutzt wird? Wie funktionierts denn hier mit dem Eurozeichen?
Ich habe das Dokument auch nochmal extra durch den Validator hier laufen lassen und er zeigt definitiv an, dass überall iso-8859-15 übergeben wird.
Erich Heidenreich
Tut mir leid, habe ich vergessen. Hier kann man sich das Beispiel ansehen: http://www.alieneye.net/testboard/signup.php
Ich habe das Dokument auch nochmal extra durch den Validator hier laufen lassen und er zeigt definitiv an, dass überall iso-8859-15 übergeben wird.
Dann betrachtest Du etwas anderes. Unter der URL steht überall windows-1252, als meta-Angabe, im doctype (erste Zeile) und außerdem auch in den HTTP-Headern.
Ich habe auch gerade gesehen, dass hier im Forum iso-8859-1 benutzt wird? Wie funktionierts denn hier mit dem Eurozeichen?
Hier wird Gott sei Dank Unicode/utf-8 benutzt.
Dann betrachtest Du etwas anderes. Unter der URL steht überall windows-1252, als meta-Angabe, im doctype (erste Zeile) und außerdem auch in den HTTP-Headern.
Das hab ich vorhin nochmal getestet und vergessen dann wieder zurückzusetzen. Ist mittlerweile wieder auf iso-8859-15. :)
Ist utf-8 besser? Sollte ich das verwenden?
Erich Heidenreich
Ist utf-8 besser? Sollte ich das verwenden?
Es ist insofern besser, als dass man jedwede Verwechslungsmöglichkeit dergestalt wie Du sie gerade erlebst von vornherein ausschließt. Das wäre zwar auch der Fall, wenn man sich zum Beispiel auf windows-1252 beschränken würde, aber die Unterschiede zwischen windows-1252, iso-8859-1 und iso-8859-15 sind in der Praxis nicht immer auf den ersten Blick zu erkennen.
Es nützt allerdings alles nichts, wenn man utf-8 nicht konsequent von Anfang bis Ende einsetzt. Dabei werden einem allerdings hier und da Steine von Anwendungen in den Weg gelegt, die Strings nicht als Zeichenketten sondern als Byteketten ansehen und/oder mit festen Kodierungen arbeiten. Wer zur Ausgabe in PHP htmlentities() statt htmlspecialchars() + content-type=utf-8 benutzt, wundert sich zum Beispiel, dass statt "Blödmann" "Blijdmann" (oder ähnlich) erscheint. Ohne explizite Angabe der Kodierung nimmt htmlentities() iso-8859-1 an und sieht deshalb statt des zwei Byte einnehmenden Zeichens utf-8-ö die zwei Ein-Byte-Zeichen Ä und ³. An dem gleichen Problem können Sortierfunktionen scheitern.
Weiterhin gilt es zu beachten, dass manche ältere Browser Formulardaten stur mit ihrer 8-Bit-Kodierung schicken anstatt utf-8 zu benutzen. Außerdem gibt es bei der Standardmethode application/x-www-form-urlencoded keine Möglichkeit für den Browser, die von ihm verwendete Zeichenkodierung zu übermitteln. http://www.w3.org/TR/html4/interact/forms.html#h-17.13.3 empfiehlt deshalb multipart/form-data für die Übermittlung von Nicht-ASCII-Daten.
Es ist also nicht so ganz leicht, utf-8 zu benutzen, zumal auf der anderen Seite das windows/8859-Durcheinander vieles verzeiht. Dafür gewinnt man auf lange Sicht Sicherheit und vergrößert ohne Umstände das Einsatzgebiet.
Also ich hab jetzt mal testweise UTF-8 reingetan, es funktioniert! :)
Allerdings bleibt noch ein kleines Problem: € so sieht das Eurozeichen im Quelltext aus und wird von meiner Überprüfung irgendwie ignoriert. Ich will nämlich auf keinen Fall Eurozeichen im Usernamen erlauben.
Und können bei UTF-8 Probleme mit Datenbanken auftreten? Und falls ja, sind die einfach zu umgehen?
Ich frage mich warum das Eurozeichen hier im Quelltext auch ein solches bleibt... :|
Erich Heidenreich
Allerdings bleibt noch ein kleines Problem: € so sieht das Eurozeichen im Quelltext aus und wird von meiner Überprüfung irgendwie ignoriert.
Du kannst nicht einfach "utf-8" sagen und erwarten, dass alles funktioniert. Unicode ist kein Heilmittel für bereits verbockte Daten, Unicode sorgt nur dafür, dass sowas nicht erst auftritt.
Du wirst schon wo nötig die existierenden Daten (inklusive PHP-Quellcodes) in utf-8 umwandeln und fremde Funktionen (von PHP zum Beispiel) auf utf-8 hinweisen müssen. Bei der Umwandlung solltest Du damit rechnen, hier und da auf falsch gekennzeichnete Kodierungen zu stoßen (windows-1252 wird gern und viel als iso-8859-1 ausgegeben, obwohl sie sich an ca. 40 Stellen unterscheiden).
Ich schrieb bereits: Problemlos läuft es nur, wenn man es von Anfang an richtig macht. Der Umbau existierender Applikationen kann mühsam sein, gar keine Frage.
Und können bei UTF-8 Probleme mit Datenbanken auftreten?
Wenn die Datenbank kein utf-8 kann, wird die Sortierung an Zeichen außerhalb ASCII möglicherweise nicht so funktionieren, wie Du es gewohnt bist. Das Problem habe ich bereits anhand von htmlentities() beschrieben.
Irreparablen Datenmüll, Abstürze oder Ähnliches wird es aber nicht geben, denn dies zu verhindern ist der eigentliche Sinn von utf-8 (utf-8 ist eine Methode, die 32-Bit-Werte von Unicode unfallfrei in herkömmliche 8-Bit-Werte zu verpacken).
Ich frage mich warum das Eurozeichen hier im Quelltext auch ein solches bleibt... :|
Vermutlich weil von vorne bis hinten und Anfang bis Ende nur Unicode verwendet wird.
Vielleicht schilderst Du einfach mal die noch existierenden, konkreten Probleme mit Beispielseite und dazugehörendem PHP-Quellcode und sagst, was Du bereits unternommen hast. Nur mit der Aussage "Sieht wie A aus, soll aber B sein!" oder gar "Geht nicht!" ist es immer etwas sehr schlecht.