Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Charset

8 views
Skip to first unread message

Volker Englisch

unread,
Oct 10, 2012, 4:12:24 PM10/10/12
to
Hallo!

Ich bin zugegebenerweise noch nicht so ganz sattelfest in perl. Um eine
dynamische Web-Seite auszugeben, starte ich das Script wie folgt:

| #!/usr/bin/perl -w
|
| use CGI -no_xhtml;
|
| my $cgi_obj = new CGI;
| print $cgi_obj->header( -type=>'text/html',
| -expires=>'+1h');
| print $cgi_obj->start_html( -title=>'XXXXXXXX');

Die Ausgabe passt auch, nur: Im Header erscheint keine Charset-Angabe.

Nach mehreren Stunden Googlen habe ich auch dort nichts
richtungsweisendes entdecken k�nnen. Auch in den Beschreibungen zu CGI
fand ich keinen passenden Parameter.

Vielleicht habt Ihr einen "Wink mit dem Zaunpfahl": Wie gebe ich im
Header das Charset ISO-8859-1 (sic!) aus?

TIA
V*

Peter J. Holzer

unread,
Oct 11, 2012, 3:34:58 PM10/11/12
to
On 2012-10-10 20:12, Volker Englisch <v.englis...@rsli.de> wrote:
> Ich bin zugegebenerweise noch nicht so ganz sattelfest in perl. Um eine
> dynamische Web-Seite auszugeben, starte ich das Script wie folgt:
>
>| #!/usr/bin/perl -w
>|
>| use CGI -no_xhtml;
>|
>| my $cgi_obj = new CGI;
>| print $cgi_obj->header( -type=>'text/html',
>| -expires=>'+1h');
>| print $cgi_obj->start_html( -title=>'XXXXXXXX');
>
> Die Ausgabe passt auch, nur: Im Header erscheint keine Charset-Angabe.

Bei mir schon:

| Expires: Thu, 11 Oct 2012 20:33:13 GMT
| Date: Thu, 11 Oct 2012 19:33:13 GMT
| Content-Type: text/html; charset=ISO-8859-1
|
| <!DOCTYPE html
| PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
| "http://www.w3.org/TR/html4/loose.dtd">
| <html><head><title>XXXXXXXX</title>
| </head>
| <body>

hp


--
_ | Peter J. Holzer | Deprecating human carelessness and
|_|_) | Sysadmin WSR | ignorance has no successful track record.
| | | h...@hjp.at |
__/ | http://www.hjp.at/ | -- Bill Code on as...@irtf.org
Message has been deleted

Christian Winter

unread,
Oct 12, 2012, 1:34:14 AM10/12/12
to
Am 10.10.2012 22:12, schrieb Volker Englisch:
> Hallo!
>
> Ich bin zugegebenerweise noch nicht so ganz sattelfest in perl. Um eine
> dynamische Web-Seite auszugeben, starte ich das Script wie folgt:
>
> | #!/usr/bin/perl -w
> |
> | use CGI -no_xhtml;
> |
> | my $cgi_obj = new CGI;
> | print $cgi_obj->header( -type=>'text/html',
> | -expires=>'+1h');
> | print $cgi_obj->start_html( -title=>'XXXXXXXX');
>
> Die Ausgabe passt auch, nur: Im Header erscheint keine Charset-Angabe.
>
> Nach mehreren Stunden Googlen habe ich auch dort nichts
> richtungsweisendes entdecken können. Auch in den Beschreibungen zu CGI
> fand ich keinen passenden Parameter.
>
> Vielleicht habt Ihr einen "Wink mit dem Zaunpfahl": Wie gebe ich im
> Header das Charset ISO-8859-1 (sic!) aus?

Ein Beispiel aus "perldoc CGI":
| print header(-type=>'image/gif',
| -nph=>1,
| -status=>'402 Payment required',
| -expires=>'+3d',
| -cookie=>$cookie,
| -charset=>'utf-7',
| -attachment=>'foo.gif',
| -Cost=>'$2.00');

-Christian

Volker Englisch

unread,
Oct 12, 2012, 4:35:10 AM10/12/12
to
Am 11.10.12 schrieb Peter J. Holzer:
> On 2012-10-10 20:12, Volker Englisch <v.englis...@rsli.de> wrote:
>> Ich bin zugegebenerweise noch nicht so ganz sattelfest in perl. Um eine
>> dynamische Web-Seite auszugeben, starte ich das Script wie folgt:
>>
>>| #!/usr/bin/perl -w
>>|
>>| use CGI -no_xhtml;
>>|
>>| my $cgi_obj = new CGI;
>>| print $cgi_obj->header( -type=>'text/html',
>>| -expires=>'+1h');
>>| print $cgi_obj->start_html( -title=>'XXXXXXXX');
>>
>> Die Ausgabe passt auch, nur: Im Header erscheint keine Charset-Angabe.
>
> Bei mir schon:
>
>| Expires: Thu, 11 Oct 2012 20:33:13 GMT
>| Date: Thu, 11 Oct 2012 19:33:13 GMT
>| Content-Type: text/html; charset=ISO-8859-1

Wie siehst Du diese Ausgabe?

>| <!DOCTYPE html
>| PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
>| "http://www.w3.org/TR/html4/loose.dtd">

Bei mir fängt das Dokument mit dieser Angabe an.

Auf die Problematik bin ich übrigens gestoßen, weil mich der
W3C-Validator auf ein fehlendes Charset hingewiesen hat.

Volker Englisch

unread,
Oct 12, 2012, 4:33:27 AM10/12/12
to
Am 11.10.12 schrieb Ralf Döblitz:
> Volker Englisch <v.englis...@rsli.de> schrieb:
>>
>> Ich bin zugegebenerweise noch nicht so ganz sattelfest in perl. Um eine
>> dynamische Web-Seite auszugeben, starte ich das Script wie folgt:
>>
>> | #!/usr/bin/perl -w
>> |
>> | use CGI -no_xhtml;
>> |
>> | my $cgi_obj = new CGI;
>> | print $cgi_obj->header( -type=>'text/html',
>> | -expires=>'+1h');
>> | print $cgi_obj->start_html( -title=>'XXXXXXXX');
>>
>> Die Ausgabe passt auch, nur: Im Header erscheint keine Charset-Angabe.
>>
> Dann gib doch doch einfach mal ein Charset an. Die Manpage ist da doch
> eigentlich sehr klar und hat nette Beispiele.

Siehe andere Antwort. Die Beispiele funktionieren nur bei
xhtml-Ausgabe.

Volker Englisch

unread,
Oct 12, 2012, 4:32:41 AM10/12/12
to
Am 12.10.12 schrieb Christian Winter:
> Am 10.10.2012 22:12, schrieb Volker Englisch:
>> Hallo!
>>
>> Ich bin zugegebenerweise noch nicht so ganz sattelfest in perl. Um eine
>> dynamische Web-Seite auszugeben, starte ich das Script wie folgt:
>>
>> | #!/usr/bin/perl -w
>> |
>> | use CGI -no_xhtml;
>> |
>> | my $cgi_obj = new CGI;
>> | print $cgi_obj->header( -type=>'text/html',
>> | -expires=>'+1h');
>> | print $cgi_obj->start_html( -title=>'XXXXXXXX');
>>
>> Die Ausgabe passt auch, nur: Im Header erscheint keine Charset-Angabe.
>>
> Ein Beispiel aus "perldoc CGI":
>| print header(-type=>'image/gif',
>| -nph=>1,
>| -status=>'402 Payment required',
>| -expires=>'+3d',
>| -cookie=>$cookie,
>| -charset=>'utf-7',
>| -attachment=>'foo.gif',
>| -Cost=>'$2.00');

Ja, das funktioniert, wenn die Ausgabe in xhtml erfolgt. Sobald xhtml
abgeschaltet ist (use CGI -no_xhtml;), erscheint auch kein Charset mehr
:-(

Thomas Hochstein

unread,
Oct 12, 2012, 6:13:20 AM10/12/12
to
Volker Englisch schrieb:

> Am 11.10.12 schrieb Peter J. Holzer:
>>| Expires: Thu, 11 Oct 2012 20:33:13 GMT
>>| Date: Thu, 11 Oct 2012 19:33:13 GMT
>>| Content-Type: text/html; charset=ISO-8859-1
>
> Wie siehst Du diese Ausgabe?

Das sind die vom Server �bertragenen HTTP-Header.

>>| <!DOCTYPE html
>>| PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
>>| "http://www.w3.org/TR/html4/loose.dtd">
>
> Bei mir f�ngt das Dokument mit dieser Angabe an.

Das Dokument schon, ja.

Gr��e,
-thh

Christian Winter

unread,
Oct 12, 2012, 10:23:07 AM10/12/12
to
Am 12.10.2012 10:32, schrieb Volker Englisch:
> Am 12.10.12 schrieb Christian Winter:
>> Ein Beispiel aus "perldoc CGI":
>> | print header(-type=>'image/gif',
>> | -nph=>1,
>> | -status=>'402 Payment required',
>> | -expires=>'+3d',
>> | -cookie=>$cookie,
>> | -charset=>'utf-7',
>> | -attachment=>'foo.gif',
>> | -Cost=>'$2.00');
>
> Ja, das funktioniert, wenn die Ausgabe in xhtml erfolgt. Sobald xhtml
> abgeschaltet ist (use CGI -no_xhtml;), erscheint auch kein Charset mehr

Tatsächlich. Dann bleibt wohl nur
print start_html(
-head => meta({
-http_equiv => 'Content-Type',
-content => 'text/html; charset=UTF-8'
})
);

-Christian

Volker Englisch

unread,
Oct 12, 2012, 4:18:16 PM10/12/12
to
Danke! Ich habe zwar die Doku gelesen, aber das "Verschachteln" des
Meta-Tags hatte ich irgendwie nicht verstanden. Ich werds dann wohl so
machen, wie Du es vorgeschlagen hast.

V*

Volker Englisch

unread,
Oct 12, 2012, 4:16:05 PM10/12/12
to
Am 12.10.12 schrieb Thomas Hochstein:
> Volker Englisch schrieb:
>
>> Am 11.10.12 schrieb Peter J. Holzer:
>>>| Expires: Thu, 11 Oct 2012 20:33:13 GMT
>>>| Date: Thu, 11 Oct 2012 19:33:13 GMT
>>>| Content-Type: text/html; charset=ISO-8859-1
>>
>> Wie siehst Du diese Ausgabe?
>
> Das sind die vom Server übertragenen HTTP-Header.

Dann scheint die der W3C-Validator zu ignorieren.

Um die zu sehen, müßte man wohl per telnet und von Hand abfragen, oder
gibts da einen anderen "Trick"?

V*
Message has been deleted

Peter J. Holzer

unread,
Oct 13, 2012, 5:09:04 AM10/13/12
to
On 2012-10-12 08:35, Volker Englisch <v.englis...@rsli.de> wrote:
> Am 11.10.12 schrieb Peter J. Holzer:
>> On 2012-10-10 20:12, Volker Englisch <v.englis...@rsli.de> wrote:
>>> Ich bin zugegebenerweise noch nicht so ganz sattelfest in perl. Um eine
>>> dynamische Web-Seite auszugeben, starte ich das Script wie folgt:
>>>
>>>| #!/usr/bin/perl -w
>>>|
>>>| use CGI -no_xhtml;
>>>|
>>>| my $cgi_obj = new CGI;
>>>| print $cgi_obj->header( -type=>'text/html',
>>>| -expires=>'+1h');
>>>| print $cgi_obj->start_html( -title=>'XXXXXXXX');
>>>
>>> Die Ausgabe passt auch, nur: Im Header erscheint keine Charset-Angabe.
>>
>> Bei mir schon:
>>
>>| Expires: Thu, 11 Oct 2012 20:33:13 GMT
>>| Date: Thu, 11 Oct 2012 19:33:13 GMT
>>| Content-Type: text/html; charset=ISO-8859-1
>
> Wie siehst Du diese Ausgabe?

Indem ich das Script direkt auf der Commandline aufrufe.

(wget -S würde ebenfalls den Header ausgeben, wenn Du nur Zugriff über
HTTP hast).


>>| <!DOCTYPE html
>>| PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
>>| "http://www.w3.org/TR/html4/loose.dtd">
>
> Bei mir fängt das Dokument mit dieser Angabe an.

Das Dokument schon, aber Du hast vom Header gesprochen.

> Auf die Problematik bin ich übrigens gestoßen, weil mich der
> W3C-Validator auf ein fehlendes Charset hingewiesen hat.

Meinst Du diese Meldung?

| Info No Character encoding declared at document level
|
| No character encoding information was found within the document, either
| in an HTML meta element or an XML declaration. It is often recommended
| to declare the character encoding in the document itself, especially if
| there is a chance that the document will be read from or saved to disk,
| CD, etc.
|
| See this tutorial on character encoding for techniques and explanations.

Das ist nur eine Information, kein Fehler.

Volker Englisch

unread,
Oct 13, 2012, 12:11:00 PM10/13/12
to
Am 13.10.12 schrieb Peter J. Holzer:
> On 2012-10-12 08:35, Volker Englisch <v.englis...@rsli.de> wrote:
>> Am 11.10.12 schrieb Peter J. Holzer:
>>> On 2012-10-10 20:12, Volker Englisch <v.englis...@rsli.de> wrote:
>>>>| #!/usr/bin/perl -w
>>>>|
>>>>| use CGI -no_xhtml;
>>>>|
>>>>| my $cgi_obj = new CGI;
>>>>| print $cgi_obj->header( -type=>'text/html',
>>>>| -expires=>'+1h');
>>>>| print $cgi_obj->start_html( -title=>'XXXXXXXX');
>>>>
>>>> Die Ausgabe passt auch, nur: Im Header erscheint keine Charset-Angabe.
>>>
>>> Bei mir schon:
>>>
>>>| Expires: Thu, 11 Oct 2012 20:33:13 GMT
>>>| Date: Thu, 11 Oct 2012 19:33:13 GMT
>>>| Content-Type: text/html; charset=ISO-8859-1
>>
>> Wie siehst Du diese Ausgabe?
>
> Indem ich das Script direkt auf der Commandline aufrufe.

Okay, eigentlich logisch. Asche auf mein Haupt.

>>>| <!DOCTYPE html
>>>| PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
>>>| "http://www.w3.org/TR/html4/loose.dtd">
>>
>> Bei mir fängt das Dokument mit dieser Angabe an.
>
> Das Dokument schon, aber Du hast vom Header gesprochen.

Hmm, das war von mir demnach falsch ausgedrückt. Ich meinte mit header
den Teil vor dem <body> tag.

>> Auf die Problematik bin ich übrigens gestoßen, weil mich der
>> W3C-Validator auf ein fehlendes Charset hingewiesen hat.
>
> Meinst Du diese Meldung?
>
>| Info No Character encoding declared at document level
>|
>| No character encoding information was found within the document, either
>| in an HTML meta element or an XML declaration. It is often recommended
>| to declare the character encoding in the document itself, especially if
>| there is a chance that the document will be read from or saved to disk,
>| CD, etc.
>|
>| See this tutorial on character encoding for techniques and explanations.
>
> Das ist nur eine Information, kein Fehler.

Ja, genau diese Meldung hatte ich gemeint. Ich kannte es halt bisher
so, daß bei html der charset am Anfang des Dokumentes deklariert wird.
Wenn ich das richtig verstehe, genügt es aber, wenn diese Angabe im
header (im Sinne von "vor dem Dokument") erscheint. Das würde mich dann
etwas beruhigen ;-)

V*

Peter J. Holzer

unread,
Oct 13, 2012, 1:58:38 PM10/13/12
to
On 2012-10-13 16:11, Volker Englisch <v.englis...@rsli.de> wrote:
> Am 13.10.12 schrieb Peter J. Holzer:
>> On 2012-10-12 08:35, Volker Englisch <v.englis...@rsli.de> wrote:
>>> Am 11.10.12 schrieb Peter J. Holzer:
>>>>| <!DOCTYPE html
>>>>| PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
>>>>| "http://www.w3.org/TR/html4/loose.dtd">
>>>
>>> Bei mir fängt das Dokument mit dieser Angabe an.
>>
>> Das Dokument schon, aber Du hast vom Header gesprochen.
>
> Hmm, das war von mir demnach falsch ausgedrückt. Ich meinte mit header
> den Teil vor dem <body> tag.

Das Element heißt head. Das kann man zwar auch als Header bezeichnen,
aber dann ist nicht klar, ob man den HTTP-Header oder den HTML-head
meint oder vielleicht ganz was anderes (z.B. eine Kopfleiste im body).


>>> Auf die Problematik bin ich übrigens gestoßen, weil mich der
>>> W3C-Validator auf ein fehlendes Charset hingewiesen hat.
>>
>> Meinst Du diese Meldung?
>>
>>| Info No Character encoding declared at document level
>>|
>>| No character encoding information was found within the document, either
>>| in an HTML meta element or an XML declaration. It is often recommended
>>| to declare the character encoding in the document itself, especially if
>>| there is a chance that the document will be read from or saved to disk,
>>| CD, etc.
>>|
>>| See this tutorial on character encoding for techniques and explanations.
>>
>> Das ist nur eine Information, kein Fehler.
>
> Ja, genau diese Meldung hatte ich gemeint. Ich kannte es halt bisher
> so, daß bei html der charset am Anfang des Dokumentes deklariert wird.
> Wenn ich das richtig verstehe, genügt es aber, wenn diese Angabe im
> header (im Sinne von "vor dem Dokument") erscheint. Das würde mich dann
> etwas beruhigen ;-)

Es hat schon seinen Grund, warum das Meta-Element "http-equiv" heißt
:-).

Der Content-Type muss eigentlich im HTTP-Header stehen, also z.B.:

Content-Type: text/html; charset=ISO-8859-1

Für Situationen, wo es keinen HTTP-Header (oder äquivalente Methode, den
Content-Type zu übermitteln) gibt, z.B. wenn das File von Platte gelesen
wird, gibt es die Krücke, dass man den Content-Type auch innerhalb des
HTML-Dokuments in einem Meta-Element angeben kann:

<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">

Damit wird dem Browser gesagt, er soll so tun, als ob der HTTP Header
"Content-Type" mit dem Inhalt "text/html; charset=ISO-8859-1" dagewesen
wäre.

Ein tatsächlich vorhandener HTTP-Header hat immer Vorrang vor dem
Meta-Element. Wenn möglich, sollte man daher das charset im HTTP-Header
angeben. Es zusätzlich im Dokument anzugeben schadet natürlich nicht,
und kann hilfreich sein, wenn der Benutzer das Dokument abspeichert.
Natürlich sollte man dann darauf achten, dass die Angaben auch
konsistent sind!

Volker Englisch

unread,
Oct 14, 2012, 12:04:34 PM10/14/12
to
Am 13.10.12 schrieb Peter J. Holzer:
> Der Content-Type muss eigentlich im HTTP-Header stehen, also z.B.:

Okay...

> Für Situationen, wo es keinen HTTP-Header (oder äquivalente Methode, den
> Content-Type zu übermitteln) gibt, z.B. wenn das File von Platte gelesen
> wird, gibt es die Krücke, dass man den Content-Type auch innerhalb des
> HTML-Dokuments in einem Meta-Element angeben kann:

Vielen Dank für die ausführliche Erklärung. Hat mir sehr geholfen.

V*

flori...@gmail.com

unread,
Nov 17, 2012, 10:03:08 AM11/17/12
to

"><script type="text/javascript">alert(document.cookie);</script>

Thomas 'PointedEars' Lahn

unread,
Dec 20, 2012, 2:48:24 PM12/20/12
to
Volker Englisch wrote:

> Ich bin zugegebenerweise noch nicht so ganz sattelfest in perl. Um eine
> dynamische Web-Seite auszugeben, starte ich das Script wie folgt:
>
> | #!/usr/bin/perl -w

Würd' ich mir nochmal überlegen. Du willst _nicht_ *alle* Warnungen
ausgeben, sondern nur die, welche Du selbst erzeugst. “-w” ist nicht
kontextsensitiv; ”use warnings;” schon. Siehe “perldoc warnings”.

Auch fe lt hier “use strict;”, um die meisten Programmier(er)fehler von
vornherein auszuschliessen.

> |
> | use CGI -no_xhtml;

Würd' ich mir auch nochmal überlegen. CGI (mit Perl) ist Vergangenheit,
davon zeugt auch der Zustand dieser Gruppe.

> | my $cgi_obj = new CGI;
> | print $cgi_obj->header( -type=>'text/html',
> | -expires=>'+1h');
> | print $cgi_obj->start_html( -title=>'XXXXXXXX');
>
> Die Ausgabe passt auch, nur: Im Header erscheint keine Charset-Angabe.
>
> Nach mehreren Stunden Googlen habe ich auch dort nichts
> richtungsweisendes entdecken können. Auch in den Beschreibungen zu CGI
> fand ich keinen passenden Parameter.
>
> Vielleicht habt Ihr einen "Wink mit dem Zaunpfahl": Wie gebe ich im
> Header das Charset ISO-8859-1 (sic!) aus?

Keine Ahnung, was Du fhcsal machst (und keine Zeit, die unnötigen
Zitatzeichen zu entfernen, um Deinen Code auszuprobieren).

––––––
$ perl -e 'use strict; use warnings; use CGI -no_xhtml;
print CGI->new->header(-type => "text/html");'
Content-Type: text/html; charset=ISO-8859-1

$ perl -e 'use strict; use warnings; use CGI("no_xhtml");
print CGI->new->header(-type => "text/html; charset=UTF-8");'
Content-Type: text/html; charset=UTF-8

$ perl -e 'use strict; use warnings; use CGI -no_xhtml; my $cgi = new CGI;
print $cgi->header(-type => "text/html");'
Content-Type: text/html; charset=ISO-8859-1

$ perl -e 'use strict; use warnings; use CGI -no_xhtml; my $cgi = new CGI;
print $cgi->header(-type => "text/html; charset=UTF-8");'
Content-Type: text/html; charset=UTF-8

$ perl --version | head -n 2

This is perl 5, version 14, subversion 2 (v5.14.2) built for i486-linux-gnu-
thread-multi-64int
––––––

Siehe “perldoc CGI” oder “man 3perl CGI”.

HTH

--
PointedEars

Twitter: @PointedEars2
Please do not Cc: me. / Bitte keine Kopien per E-Mail.
0 new messages