myAlexander: UTF-8 und deutsche Umlaute

Hallo @all,

in einem vorherigen Thread hatte ich wissen wollen, wie man russische Texte via PHP in Textfiles abspeichern kann. Funktioniert mittlerweile prima.

Allerdings hat sich dadurch ein neues Problem ergeben:

Ich benutze ein Formular, über das ich gemeinsam deutsche, englische und russische Texte einpflege. Für die Eingabe der russischen Texte habe ich die Meta-Angabe der HTML-Seite und den Form-Header erweitert:

<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<form action="...php" method="post" accept-charset="ISO-8859-1, ISO-8859-2, UTF-8">

Leider werden jetzt bei der Eingabe von deutschen Texten die Umlaute nicht mehr korrekt übernommen (äöü = äöü). Ich habe schon versucht, die gesendeten Texte via php (htmlentities) umzuwandeln, aber da greift php zu spät, weil die Texte ja schon "falsch" gesendet werden.

Was muss ich tun, damit die deutschen Umlaute wieder passen?

Viele Grüße
Alexander

  1. hi,

    Ich benutze ein Formular, über das ich gemeinsam deutsche, englische und russische Texte einpflege.

    Und diese willst du alle als UTF-8 abspeichern und wieder ausgeben - oder nicht?

    Für die Eingabe der russischen Texte habe ich die Meta-Angabe der HTML-Seite und den Form-Header erweitert:

    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <form action="...php" method="post" accept-charset="ISO-8859-1, ISO-8859-2, UTF-8">

    Leider werden jetzt bei der Eingabe von deutschen Texten die Umlaute nicht mehr korrekt übernommen (äöü = äöü).

    Das dürfte doch die ASCII-kompatible Darstellung dieser Zeichen in UTF-8 sein.

    Was muss ich tun, damit die deutschen Umlaute wieder passen?

    Am wenigsten Probleme dürftest du haben, wenn du konsequent für alle "Sprachen" auf UTF-8 setzt.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Und diese willst du alle als UTF-8 abspeichern und wieder ausgeben - oder nicht?

      Das ist mir im Grunde egal ;-) Ich möchte nur, das die Darstellung klappt.

      Am wenigsten Probleme dürftest du haben, wenn du konsequent für alle "Sprachen" auf UTF-8 setzt.

      Naja, was bedeutet das jetzt praktisch? Ich habe in der Form-Angabe zwar noch Iso-Charsets stehen, diese habe ich aber nur nachträglich eingefügt beim Versuch, die Umlaute lesbar zu machen >> was nicht funktioniert hat.

      Momentan gehe ich davon aus, das die Meta-Angabe die korrekte Übernahme von Umlauten verhindert.

      Was muss ich also praktisch tun, um zum einen deutsche Umlaute benutzen zu können und gleichzeitig russische Charsets?

      Alexander

      1. Hallo,

        Was muss ich also praktisch tun, um zum einen deutsche Umlaute benutzen zu können und gleichzeitig russische Charsets?

        wie wahsaga schon wahrsagte: benutze ausschließlich UTF-8.
        Schau Dir mal zum Beispiel die Wikipedia-Startseite an. Dort werden japanische, arabische, hebräische und russische Zeichen verwendet. Sie sind alle in UTF-8 enthalten. Ob die Zeichen dann auch im Browser dargestellt werden, hängt davon ab, ob ein passender Font zur Verfügung steht, mit dem die Zeichen gerendert werden können.

        Ciao,
        Andreas

  2. Moin!

    <form action="...php" method="post" accept-charset="ISO-8859-1, ISO-8859-2, UTF-8">

    Dieses accept-charset ist ULTRABÖSE! Bitte schmeiße es raus, verwende AUSSCHLIESSLICH UTF-8!

    Es erlaubt dem Browser, die eingegebenen Zeichen in einer der drei Codierungen zu senden. Leider sendet er aber nicht mit, welche Codierung er gewählt hat, d.h. du kannst auf dem Server nicht mehr feststellen, ob da jetzt jemand den eher sinnlosen Text "ä" eingegeben und der Browser ISO-8859-1 gesendet hat, oder ob stattdessen eher "ä" eingegeben und der Browser UTF-8 gesendet hat. In einem Text, in dem es um die UTF-8-Darstellung des ä gehen würde, würde auch mit Logik nicht erklärbar sein, ob "ä" jetzt so gemeint ist, oder ein "ä" sein soll.

    Manche Browser sind auch so nett, und wandeln alle nicht in der gewählten Codierung darstellbare Zeichen in numerische Zeichenreferenzen um. Das macht die Sache noch schlimmer: Das russische Щ erscheint in ISO-8859-1 als Text "&#1065;" - und man kann nicht erkennen, ob der Benutzer jetzt das Щ eingegeben hat, oder den Text "&#1065;" - das &-Zeichen wird nämlich nicht codiert, weder als &amp;, noch als &#38;.

    Ich vermute, dass du genau in so eine Falle getappt bist, und dein Browser in irgendeiner Weise den Zeichensatz mißverstanden hat.

    Oder die angezeigte deutsche Seite nutzt kein UTF-8 (wie erwähnt: Immer im HTTP-Header und Meta-Tag identische Angaben machen lassen, wobei das Meta-Tag kein Problem ist, wichtiger aber ist der HTTP-Header! Unbedingt nachprüfen im Browser, was der darüber sagt.)

    - Sven Rautenberg

    --
    My sssignature, my preciousssss!
    1. Hallo,

      <form action="...php" method="post" accept-charset="ISO-8859-1, ISO-8859-2, UTF-8">

      Dieses accept-charset ist ULTRABÖSE! Bitte schmeiße es raus, verwende AUSSCHLIESSLICH UTF-8!

      Es erlaubt dem Browser, die eingegebenen Zeichen in einer der drei Codierungen zu senden. Leider sendet er aber nicht mit, welche Codierung er gewählt hat, d.h. du kannst auf dem Server nicht mehr feststellen, ob da jetzt jemand den eher sinnlosen Text "ä" eingegeben und der Browser ISO-8859-1 gesendet hat, oder ob stattdessen eher "ä" eingegeben und der Browser UTF-8 gesendet hat.

      Kleine Ergänzung:
      Man kann es durchaus - mit ziemlichem Aufwand - serverseitig feststellen, z.B. indem man ein verstecktes Eingabefeld mit einem Zeichen befüllt, dass in den drei Kodierungen jeweils mit einer unterschiedlichen Bytesequenz kodiert wird. Oder man nutzt ein verstecktes Eingabefeld mit dem Namen _charset_. Manche Browser schreiben dort automatisch die verwendete Kodierung hinein. Oder man schaut, ob im Content-Type-Header des POST-Requests eine charset-Angabe vorhanden ist; manche Browser geben diese an.

      <input type="hidden" name="indikator" value="¡">
      <input type="hidden" name="_charset_">

      Was aber nichts an der Empfehlung ändert, nur UTF-8 zu verwenden.

      Wenn man UTF-8 benutzt, muss man höchstens damit rechnen, dass uralte Browser gerne mal notorisch ISO-8859-1 senden. Dazu wären die besagten Methoden weiterhin anwendbar.

      Mathias

      1. 你好 molily,

        Man kann es durchaus - mit ziemlichem Aufwand - serverseitig feststellen,
        z.B. indem man ein verstecktes Eingabefeld mit einem Zeichen befüllt,
        dass in den drei Kodierungen jeweils mit einer unterschiedlichen
        Bytesequenz kodiert wird.

        Ja, so mache ich es auch hier. Läuft aber letztenendes auf raten hinaus.

        再见,
         克里斯蒂安

        --
        Herbst. | (X)Emacs: buffer-cycle.el
        Nur die Weisesten und die Dümmsten können sich nicht ändern.
        http://wwwtech.de/