Browser fällt nach UTF-8 zurück
Kevin
- php
Hallo,
ich habe in meinen Seiten überall und in allen Variationen (meta-tag, http-header, im form-tag) den Zeichensatz iso-8859-1 eingestellt. Das funktioniert soweit auch gut, außer in genau einem Fall: Wenn der User sich einloggt wird die resultierende Seite in UTF-8 gesendet (oder zumindest versucht der Browser es als UTF-8 anzuzeigen), was in Sonderzeichen-Müll endet.
Rufe ich danach die gleiche Seite einfach nochmal auf (allerdings ohne die geposteten Formular-Login-Daten), ist wieder alles iso-8859-1. Wie kommt das? Oder besser, wie komme ich dem auf die Schliche?
So denn,
mfg. Kevin.
Hi,
Oder besser, wie komme ich dem auf die Schliche?
HTTP-Live-Headers in Firefox wäre ein guter Start.
Cheatah
HTTP-Live-Headers in Firefox wäre ein guter Start.
POST /login.php HTTP/1.1
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.0.4) Gecko/20060508 Firefox/1.5.0.4
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: de,en;q=0.7,en-us;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 60
HTTP/1.x 200 OK
Date: Thu, 15 Jun 2006 17:24:06 GMT
Server: Apache
X-Powered-By: PHP/4.3.7
Set-Cookie: PHPSESSID=566962bdf122065669ec9309ccd2919e; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8
Da gibt der Server also UTF-8 zurück. Aber warum? Die allererste Zeile Code ist immer
header("Content-Type: text/html; charset=iso-8859-1");
Außerdem sollte das meta-Tag ja eigentlich für Klarheit sorgen:
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
Erneutes aufrufen derselben Seite nach dem Login bringt:
GET /login.php HTTP/1.1
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.0.4) Gecko/20060508 Firefox/1.5.0.4
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: de,en;q=0.7,en-us;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Cookie: PHPSESSID=566962bdf122065669ec9309ccd2919e
HTTP/1.x 200 OK
Date: Thu, 15 Jun 2006 17:29:26 GMT
Server: Apache
X-Powered-By: PHP/4.3.7
Set-Cookie: PHPSESSID=566962bdf122065669ec9309ccd2919e; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html; charset=iso-8859-1
Dann stimmt's...
So denn,
mfg. Kevin.
Hi,
Content-Type: text/html; charset=UTF-8
Noch Fragen?
cu,
Andreas
Hi,
Content-Type: text/html; charset=UTF-8
Noch Fragen?
Eine: Warum? Wenn doch gegenteiliges eingestellt ist...
Hi,
Content-Type: text/html; charset=UTF-8
Noch Fragen?
Eine: Warum? Wenn doch gegenteiliges eingestellt ist...
Weil Dein Script das sendet?
Weil irgendwas falsch konfiguriert ist?
Woher sollen wir das wissen?
Wir kennen weder Dein Script noch die Serverkonfiguration.
cu,
Andreas
Moin!
Content-Type: text/html; charset=UTF-8
Da gibt der Server also UTF-8 zurück. Aber warum? Die allererste Zeile Code ist immer
header("Content-Type: text/html; charset=iso-8859-1");
Wird dieser Header auch beim Login gesendet? Da wird doch üblicherweise ganz zuerst mit if verzweigt, je nachdem, ob POST oder GET gefordert ist. Wenn dein header() dann nur in einem Zweig steht, und du gerade betriebsblind bist, erklärt das alles.
Außerdem sollte das meta-Tag ja eigentlich für Klarheit sorgen:
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
Der HTML-Metatag hat keinerlei Bedeutung, wenn im HTTP-Header eine Angabe existiert. Er ist nur dann relevant, wenn KEIN HTTP-Header existiert - beispielsweise beim Laden von Festplatte. Insofern also schon sinnvoll, ihn mit anzugeben, und manche Serverkonfiguration liest beim Ausliefern einer statischen HTML-Seite auch die Metatags und setzt dementsprechend die HTTP-Header - aber in deinem speziellen Fall hilft dir das absolut nicht, weil HTTP Vorrang hat.
- Sven Rautenberg
Hi Sven,
header("Content-Type: text/html; charset=iso-8859-1");
Wird dieser Header auch beim Login gesendet? Da wird doch üblicherweise ganz zuerst mit if verzweigt, je nachdem, ob POST oder GET gefordert ist. Wenn dein header() dann nur in einem Zweig steht, und du gerade betriebsblind bist, erklärt das alles.
Ja, wird immer gesendet. Habs in die Konfigurationsdatei gepackt, ohne die gar nicht ginge.
Noch was interessantes. Wenn ich direkt vor dem header()-Aufruf eine Ausgabe mache: echo("blabla"); proviziere ich damit natürlich eine PHP Warning, weil die Headerdaten dann nicht mehr geändert werden können und auch die Session nicht mehr gestartet werden kann. Genau in diesem Fall allerdings stimmt plötzlich der content-type header.
Das gleiche passiert auch, wenn ich den header()-Aufruf komplett entferne und nur Text ausgebe, dann geht das Session-starten schief - aber der Content-type stimmt. Soll heißen: Es scheint so, als gäbe es einen Zusammenhang zwischen dem Starten der Session und dem Content-Type-Header.
Ich werd mal versuchen, dass ganze anhand einer einfachen Datei mit wenig Code nachzustellen, dann kann ich das auch posten, ansonsten kommen wir hier glaub ich kaum weiter.
Paar Infos noch: in php.ini und httpd.conf sind jeweils die Default Charsets auf iso-8859-1 eingestellt. Bringt nur nix ;-)
So denn,
mfg. Kevin.