Flownie: Charset - Das unbekannte Mysterium

Hallo

Die verschiedenen Charsets von iso über UTF und weiss nicht alles, wird wohl immer ein dunkles Geheimnis für mich bleiben, deshalb schmeisse ich die Frage doch in die Expertenrunde:

Ich programmiere eine Seite, die zwar mehrsprachig ist, aber auf weiteres wohl in keiner exotischen Sprache wie japanisch, russisch oder weiss ich was, sondern vorläufig Deutsch, Französisch und eventuell Italienisch. Deshalb habe ich folgende Angabe im Header:

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

Nun benutze ich ASP und lasse die ganzen Texte mit Server.HTMLEncode durchfiltern, damit Sonderzeichen und Umlaute in HTML Entities umgewandelt werden. Diese Funktion wandelt ein ü zum Beispiel aber nicht in &uuml; sondern in &#252; um.

Langer Rede kurzer Sinn:
Kann ich den Charset mit dieser Umwandlung auf iso-8859-1 belassen oder sollte ich auf utf-8 wechseln?

  1. Du solltest grundsätzlich auf UTF-8 wechseln. Damit gehst du vielen Problemen, die die Zukunft mit anderen Sprachen bringen könnte, aus dem Weg.

  2. Hallo!

    Langer Rede kurzer Sinn:
    Kann ich den Charset mit dieser Umwandlung auf iso-8859-1 belassen oder sollte ich auf utf-8 wechseln?

    Gegenfrage: Gibt es einen Grund, nicht UTF-8 zu verwenden und das Ändern der Sonderzeichen einfach bleiben zu lassen?

    --
    "Die Diebesgilde beklagte sich darueber, dass Mumm in aller Oeffentlichkeit behauptet hatte, hinter den meisten Diebstaehlen steckten Diebe."
          - T. Pratchett
  3. Hi,

    Deshalb habe ich folgende Angabe im Header:
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

    diese Zeile ist wahrscheinlich bedeutungslos. Wichtig ist: Sendet der Server im HTTP-Header die gleiche Codierung? Denn nur wenn er keine Angabe dazu macht, zählt ersatzweise die Information aus dem entsprechenden meta-Element.

    lasse die ganzen Texte mit Server.HTMLEncode durchfiltern, damit Sonderzeichen und Umlaute in HTML Entities umgewandelt werden.

    Warum? Hast du in einen Texten Zeichen, die in ISO-8859-1 nicht darstellbar sind? Wenn nicht, dann gib den Text doch einfach im Klartext aus und lass die Umwandlung in HTML-Entities sein.

    Diese Funktion wandelt ein ü zum Beispiel aber nicht in &uuml; sondern in &#252; um.

    Macht nichts, das ist das Gleiche.

    Kann ich den Charset mit dieser Umwandlung auf iso-8859-1 belassen oder sollte ich auf utf-8 wechseln?

    Nach deiner bisherigen Beschreibung kannst du entweder alles so lassen wie es ist, oder sogar auf dein HTMLEncode verzichten. Wenn du allerdings ganz sicher gehen willst, stell alles auf UTF-8 um - und dann kannst du auch endgültig auf irgendwelche Umcodierungen verzichten. Das mag im Moment etwas Aufwand sein, aber dann hast du kein Problem, wenn in einem halben Jahr jemand kommt und meint, er bräuchte nun doch noch eine griechische und eine türkische Fassung (ja, auch die türkische Sprache hat ein paar Zeichen, die mit ISO-8859-1 nicht abgedeckt sind).

    So long,
     Martin

    --
    Zwischen Leber und Milz
    passt immer noch'n Pils.
    1. echo $begrüßung;

      » lasse die ganzen Texte mit Server.HTMLEncode durchfiltern, damit Sonderzeichen und Umlaute in HTML Entities umgewandelt werden.
      Warum? Hast du in einen Texten Zeichen, die in ISO-8859-1 nicht darstellbar sind? Wenn nicht, dann gib den Text doch einfach im Klartext aus und lass die Umwandlung in HTML-Entities sein.

      Das ist vermutlich keine gute Empfehlung. Ich weiß zwar nicht, was diese ASP-Funktion genau macht, aber ihr Pendant in ASP.NET kümmert sich neben den Zeichen 0xA0 bis 0xFF auch um <, >, " und &. Die will man nicht unbedingt 1:1 ausgeben. (Die Zeichen oberhalb von 0xFF werden nicht NCRisiert. Auch gibt es leider keine (mitgelieferte) Funktion (in ASP.NET), die nur die HTML-eigenen Zeichen berücksichtigt.)

      » Diese Funktion wandelt ein ü zum Beispiel aber nicht in &uuml; sondern in &#252; um.

      Progammiertechnisch ist es einfacher, den Zahlenwert zu ermitteln als sich für alle Zeichen die Entitys herauszusuchen.

      echo "$verabschiedung $name";

      1. Hallo,

        »» [...] gib den Text doch einfach im Klartext aus und lass die Umwandlung in HTML-Entities sein.
        Das ist vermutlich keine gute Empfehlung. Ich weiß zwar nicht, was diese ASP-Funktion genau macht, aber ihr Pendant in ASP.NET kümmert sich neben den Zeichen 0xA0 bis 0xFF auch um <, >, " und &. Die will man nicht unbedingt 1:1 ausgeben.

        ach so ... okay, so hab ich es nicht betrachtet. Ich bin davon ausgegangen, DASS man den Rohtext (den ich stillschweigend als HTML-Quelltext verstanden habe) 1:1 so ausgeben möchte.

        Wenn natürlich Text auch wirklich nur als Text ausgegeben und nicht als HTML interpretiert werden soll, ist dein Einwand absolut berechtigt - dann sollte, nein, muss man wenigstens diese drei Zeichen[1] tatsächlich maskieren (in der Art wie htmlspecialchars() in PHP). Notfalls muss man sich eine solche Funktion selbst schreiben.

        Gute Nacht,
         Martin

        [1] Ja, drei Zeichen: Das Anführungszeichen nur, wenn es innerhalb von Attributwerten vorkommt, was wir ja durch die Maskierung von '<' und '>' schon ausgeschlossen haben. Wo kein Tag, da auch kein Attribut. ;-)

        --
        Bitte komme jemand mit einem *g* zum Wochenende, damit nicht über mich gelacht wird.
          (Gunnar Bittersmann)
        1. @@Der Martin:

          nuqneH

          [1] Ja, drei Zeichen

          Nein, zwei. '>' muss nicht escapet werden.

          Qapla'

          --
          Bildung lässt sich nicht downloaden. (Günther Jauch)
  4. @@Flownie:

    nuqneH

    Die verschiedenen Charsets von iso über UTF und weiss nicht alles, wird wohl immer ein dunkles Geheimnis für mich bleiben

    Das muss nicht so sein. Ich hab einige Artikel speziell für dich übersetzt. ;-)

    Zeichencodierung für Dummies wäre ein Einstieg.

    Ich programmiere eine Seite, die zwar mehrsprachig ist, aber auf weiteres wohl in keiner exotischen Sprache wie japanisch, russisch oder weiss ich was, sondern vorläufig Deutsch, Französisch und eventuell Italienisch.

    Das Französische ist mit ISO 8859-1 nicht abgedeckt. Und das Deutsche auch nicht.

    Diese Funktion wandelt ein ü zum Beispiel aber nicht in &uuml; sondern in &#252; um.

    Du solltest werder die eine noch die andere Umwandlung vornehmen: „Es ist fast immer besser, eine Zeichencodierung zu benutzen, die es erlaubt, die Zeichen in ihrer normalen Form zu verwenden, anstatt Zeichen-Entity-Referenzen oder numerische Zeichenreferenzen zu verwenden.“

    Kann ich den Charset mit dieser Umwandlung auf iso-8859-1 belassen oder sollte ich auf utf-8 wechseln?

    Wechseln.

    Qapla'

    --
    Bildung lässt sich nicht downloaden. (Günther Jauch)