PHP erkennt Eurozeichen bei mir immer nur als Fragezeichen.
PHP kennt keine Zeichenkodierungen als integriertes Attribute seines String-Typs, htmlentities() nimmt standardmäßig 8859-1 an. Dein Browser schickt Windows-1252 und da in iso-8859-1 auf Position 128 (-1252-€) kein darstellbares Zeichen vorhanden ist, siehst Du statt des € ein Fragezeichen. Würde Dein Browser statt -1252 -15 (€ auf Position 164) schicken, würdest Du das Währungszeichen ¤ (Position 164 in -1) sehen.
Du musst htmlentities() mit dem dritten Parameter sagen, welche Kodierung Sache ist. Formulardaten sollen Browser in der Kodierung senden, in der das Formular vom Server gekommen ist. Es gibt außerdem die Möglichkeit, mit accept-charset beim Formular zu arbeiten (siehe HTML-Code dieser Forumsseiten). Die Kodierung der Formulardaten lässt sich also leidlich vorhersagen.
Und warum sollte der Zeichensatz als windows-1252 erkannt werden, wenn ich 8859-1 in der HTML Datei angebe?
Weil das -1252-Eurozeichen im -1-Gewand eine Pest ist. Schalte die Standardkodierung Deines Browsers mal auf -15 und Du wirst in kurzer Zeit sehen, was ich meine. Und das ist nur die Spitze des Eisbergs, die Seiten, die in -1252 geschrieben wurden, aber überhaupt keine Kodierung angeben.
Firefox sollte das doch richtig machen, oder?
Man hat sich für Kompatibilität entschieden, Gnade vor Recht sozusagen.