Christof Hoppe: kyrillisch im textfeld......UTF-8 ?

Hallo,
ich habe ein problem: (Deswegen sind die meisten hier :-) )
Ich möchte vom Benutzer ein Textfeld ausfüllen lassen und übergebe dieses Textfeld per "Post" an ein PHP-Script.
Diese PHP-Script gibt dann den Text aus.
Das Problem dabei ist, dass der Text zu 99% Kyrillisch ist. Er wird also über einen Windowsrechner mit Kyrillischem Zeichensatz eingegeben.

Das PHP Script gibt auch brav den kyrillischen Text aus. Aber:
Schau ich mir den Quelltext an, finde ich dort Codierte kyrillische zeichen, etwa &#1072 etc.. Und das für JEDES Zeichen!
Ich möchte aber im Quelltext echte russische Zeichen stehen haben. (wie beispielsweise auf google.ru)

Doch was muss ich dafür tun? Den Charset habe ich bereits auf UTF-8 umgestellt, hat aber nix geholfen.
Kennt jemand die Lösung für dieses Problem?

Vielen Dank.
MfG Christof

PS: Der header sieht so aus:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Untitled Document</title>
</head>
<body>

  1. Hi,

    Das PHP Script gibt auch brav den kyrillischen Text aus. Aber:
    Schau ich mir den Quelltext an, finde ich dort Codierte kyrillische zeichen, etwa &#1072 etc.. Und das für JEDES Zeichen!

    Dann gibt das Scipt die Zeichen in kodierter Form aus und Du müßtest dort ansetzen.

    PS: Der header sieht so aus:

    Dies ist kein Header, sondern der Kopf des Dokuments. Sofern der Server im HTTP-Header eine Kodierung angibt, gilt diese. Und wenn Du wirklich UTF-8 verwendest, müßtest Du die Sonderzeichen natürlich auch UTF-8 kodieren.

    freundliche Grüße
    Ingo

  2. Moin!

    Das PHP Script gibt auch brav den kyrillischen Text aus. Aber:
    Schau ich mir den Quelltext an, finde ich dort Codierte kyrillische zeichen, etwa &#1072 etc.. Und das für JEDES Zeichen!
    Ich möchte aber im Quelltext echte russische Zeichen stehen haben. (wie beispielsweise auf google.ru)

    UTF-8 ist tatsächlich eine mögliche Lösung für dein Problem.

    Warum du die ganzen Entities siehst, ist im verwendeten Browser begründet - und das ist _eigentlich_ auch ein Bug des Browsers.

    Im HTTP-Header deines Formulars und im HTML-Kopf (Meta-Angabe) kann stehen, welchen Zeichensatz diese Seite verwendet. Dort muß UTF-8 drinstehen - und alle Zeichen müssen dann natürlich UTF-8-codiert sein.

    Außerdem gibt es für <form> noch das Attribut "accept-charset", welches du ebenfalls auf "utf-8" setzen solltest. Erst dann kannst du mit einiger Sicherheit davon ausgehen, dass die Mehrheit der Browser dir tatsächlich UTF-8-codierte Texte schickt.

    Setzt du nicht alle diese Möglichkeiten auf UTF-8, dann sucht sich der Browser unter Umständen eine eigene Zeichencodierung wie ISO-8859-1 raus und schickt damit. Dann gibts für russische Zeichen zwei Möglichkeiten:
    1. Sie werden in "Fragezeichen" umgewandelt, und zwar echte ASCII-Fragezeichen. Sie sind somit unwiederruflich verloren. Der Grund ist, dass das russische Zeichen nicht in der gewählten Zeichencodierung codiert werden konnte. Diese Verhaltensweise ist die begrüßenswerteste, weil sie die ehrlichste ist. Uncodierbare Zeichen können nun einmal nicht doch irgendwie codiert werden.

    2. Alternativ setzt der Browser die uncodierbaren Zeichen in numerische Entities um. Diese Methode hilft aber nur scheinbar, denn man kann serverseitig keinerlei Unterscheidung mehr treffen, ob der Benutzer jetzt tatsächlich einen russischen (oder chinesischen, japanischen,...) Buchstaben eingegeben hat, oder ob er die numerische Entity eingetippt hat. Das ist schlecht.

    Doch was muss ich dafür tun? Den Charset habe ich bereits auf UTF-8 umgestellt, hat aber nix geholfen.

    Wie gesagt: Du hast drei Orte, an denen du auf UTF-8 umstellen mußt. Der HTML-Head ist dabei der unwichtigste, weil unwirksamste von allen.

    - Sven Rautenberg

    1. Im HTTP-Header deines Formulars und im HTML-Kopf (Meta-Angabe) kann stehen, welchen Zeichensatz diese Seite verwendet. Dort muß UTF-8 drinstehen - und alle Zeichen müssen dann natürlich UTF-8-codiert sein.

      Ich habe fast alles verstanden....Nur eins nicht:
      Wie bzw. wo ändere ich den Header meines Formulares? Meinst Du damit dass der server die daten anders verarbeiten muss?
      Ich benutze apache.... ;-)

      Die anderen Sachen werd ich gleich morgen früh ausprobieren.

      Vielen Dank!
      Christof

      1. Moin!

        Im HTTP-Header deines Formulars und im HTML-Kopf (Meta-Angabe) kann stehen, welchen Zeichensatz diese Seite verwendet. Dort muß UTF-8 drinstehen - und alle Zeichen müssen dann natürlich UTF-8-codiert sein.

        Ich habe fast alles verstanden....Nur eins nicht:
        Wie bzw. wo ändere ich den Header meines Formulares? Meinst Du damit dass der server die daten anders verarbeiten muss?

        Nein, die Verarbeitung bleibt exakt gleich - die gesendeten Bytes ändern sich.

        Der HTTP-Header deines Formulars ist die einzig relevante Angabe, mit welchen Zeichensatz der Browser die HTML-Seite zu interpretieren hat. Diese Angabe kann beispielsweise durch das explizite Ausgeben eines HTTP-Headers mit PHP erfolgen

        headers("Content-type: text/html;charset=UTF-8");

        Alternativ kann man dem Apache sowohl in seiner httpd.conf als auch in einer .htaccess konfigurieren, mit welchem Standardzeichensatz er HTML-Seiten ausliefern soll.

        Und ich bin mir nicht ganz sicher, vermute aber (ganz wild), dass der Apache auch die META-Angabe in HTML-Dateien parst, erkennt und als Header senden könnte.

        In jedem Fall solltest du dir das im Browser angekommene Resultat ansehen. Opera hat dafür in seinen Panels "Info" ("Encoding from server" ist da wichtig), Mozilla sagts dir über "Tools"->"Page Info" (oder Strg+J), und der Internet Explorer sagts dir, wenn du "View"->"Encoding" wählst und den dort angehakten Zustand abliest. (Sorry, die deutschen Versionen werden ihre Menüs anders benannt haben.)

        - Sven Rautenberg