Tom2 (der authentifizierte): Codierungs-Problem mit DOM-Objekten

Hallo Leute

Ich habe ein Problem mit den DOM-Objekten von JavaScript, für welches mir keine Lösung einfallen will. Einen Teil meiner Seite bilde ich mit JavaScript, was auch ganz gut funktioniert. Wenn jedoch codierte Sonderzeichen (wie ä oder ’ für ') im dynamischen Inhalt vorkommen, dann wird das Anführende kaufmännische Und zu & codiert. Wie kann ich das verhindern oder rückgängig machen?

Es handelt sich um ein Dashboard Widget für MacOS X, darum muss mein Code nur im Safari laufen. Dieser kennt jedoch innerHTML nicht. Hat jemand einen besseren Vorschlag? Ich bin für jede Idee dankbar.

Gruss & Dank

Tom2

  1. hi,

    Einen Teil meiner Seite bilde ich mit JavaScript, was auch ganz gut funktioniert. Wenn jedoch codierte Sonderzeichen (wie ä oder ’ für ') im dynamischen Inhalt vorkommen,

    Wie und wo "kommen sie vor"?

    dann wird das Anführende kaufmännische Und zu & codiert.

    Bei welcher Behandlung der Daten?

    Es handelt sich um ein Dashboard Widget für MacOS X, darum muss mein Code nur im Safari laufen. Dieser kennt jedoch innerHTML nicht. Hat jemand einen besseren Vorschlag?

    Abgesehen davon, dass wir doch IIRC erst letzte Tage hier festgestellt hatten, dass er das doch tut (ggf. erst ab bestimmter Version?) -
    Elemente per DOM erzeugen und ins Dokument einhängen?

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
  2. Hallo,

    Ich habe ein Problem mit den DOM-Objekten von JavaScript, für welches mir keine Lösung einfallen will. Einen Teil meiner Seite bilde ich mit JavaScript, was auch ganz gut funktioniert. Wenn jedoch codierte Sonderzeichen (wie ä oder ’ für ') im dynamischen Inhalt vorkommen, dann wird das Anführende kaufmännische Und zu & codiert. Wie kann ich das verhindern oder rückgängig machen?

    Meinst du zufällig, dass z.B. ä nicht zu ä wird, wenn du den Wert eines Textknotens setzt?
    In dem Fall kannst (und musst) du keine »maskierten« Zeichen benutzen. Diese Zeichen kannst du auch direkt im JavaScript-Code notieren. Oder wo kommt der dynamische Inhalt her?

    Ansonsten verstehe ich dein Problem nicht ganz, etwas Beispielcode wäre hilfreich.

    Es handelt sich um ein Dashboard Widget für MacOS X, darum muss mein Code nur im Safari laufen. Dieser kennt jedoch innerHTML nicht.

    Safari kann innerHTML prinzipiell, ich nehme also an, auch ein Widget kann davon Gebrauch machen.

    Gruss & Dank

    Hier werden keine Entity-Referenzen interpretiert - genausowenig wie in JavaScript. ;)

    Mathias

    1. Hi

      Meinst du zufällig, dass z.B. ä nicht zu ä wird, wenn du den Wert eines Textknotens setzt?

      Ja, ich erzeuge das Element mit createTextNode(). Aber ich habe auch dasselbe Problem, wenn ich den Textknoten 1:1 aus dem Quellbaum in mein HTML-Dokument kopieren will (addNodeToContent()).

      var content = document.getElementById('content');
      /* 1. Variante */
      content.appendChild(
        documenment.createTextNode('Test mit Sonderzeichen: ä ö')
      );
      alert(content.lastChild.firstChild.data);
      /* Seltsamerweise erscheint der Text korrekt in der Alert-Box, jedoch nicht im Browser und im DOM Tree Viewer */

      /* 2. Variante */
      function addNodeToContent(node)
        var content = document.getElementById('content');
        content.appendChild(node.cloneNode(true));
      }

      In dem Fall kannst (und musst) du keine »maskierten« Zeichen benutzen. Diese Zeichen kannst du auch direkt im JavaScript-Code notieren. Oder wo kommt der dynamische Inhalt her?

      Safari kann innerHTML prinzipiell, ich nehme also an, auch ein Widget kann davon Gebrauch machen.

      Wirklich? Das werde ich heute Abend ausprobieren. Ich hab's gar nicht ausprobiert bis jetzt weil ich auf DOM setzen möchte und in SelfHTML stand, dass es nicht unterstützt würde.

      Gruss & Dank

      Tom2

  3. Hi,

    abgesehen vom bereits gesagten:

    Wenn jedoch codierte Sonderzeichen (wie ä oder ’ für ') im dynamischen Inhalt vorkommen,

    Aus dem später erwähnten innerHTML schließe ich, daß es sich um ein HTML-Dokument handelt.
    In einem HTML-Dokument sind Zeichen zwischen 128 und 159 nicht zulässig.
    Und Zeichen ’ ist auch kein ', sondern ein Steuerzeichen (PU2 - Private Use Two).

    Dieser kennt jedoch innerHTML nicht.

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    Schreinerei Waechter
    O o ostern ...
    Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
    1. Hi

      Aus dem später erwähnten innerHTML schließe ich, daß es sich um ein HTML-Dokument handelt.

      Die Quelle ist ein RSS-Feed, der Inhalt soll ins HTML.

      In einem HTML-Dokument sind Zeichen zwischen 128 und 159 nicht zulässig.

      Woher entnimmst du diese Information? Ich muss mich wohl noch etwas intensiver mit der Thematik beschäftigen.

      Und Zeichen ’ ist auch kein ', sondern ein Steuerzeichen (PU2 - Private Use Two).

      Apple sieht das anscheinend anders: http://images.apple.com/main/rss/hotnews/hotnews.rss

      Es sind nicht nur die von mir erwähnten Sonderzeichen, sondern auch < und > und vieles mehr. Mit Unicode-kodierten Feeds, beispielsweise in Japanisch, habe ich absolut keine Probleme.

      Gruss & Dank
      Tom2

      1. Hi,

        In einem HTML-Dokument sind Zeichen zwischen 128 und 159 nicht zulässig.
        Woher entnimmst du diese Information? Ich muss mich wohl noch etwas intensiver mit der Thematik beschäftigen.

        z.B. aus http://www.w3.org/TR/html4/sgml/sgmldecl.html
        dort steht unter DESCSET
        128     32      UNUSED

        Ab Code 128 (einschließlich) sind 32 Zeichen (also bis einschließlich 159) unbenutzt.

        Und Zeichen &#146; ist auch kein ', sondern ein Steuerzeichen (PU2 - Private Use Two).
        Apple sieht das anscheinend anders: http://images.apple.com/main/rss/hotnews/hotnews.rss

        Dann sieht Apple das falsch.

        Die Notation &#146; bedeutet (in HTML genauso wie in XML), daß es sich um das Zeichen 146 (Hex: 92) aus Unicode handelt - und das ist das von mir genannte Steuerzeichen.
        Die Nummer bezieht sich immer auf Unicode, nicht auf die für das jeweilige Dokument geltende Codierung.

        cu,
        Andreas

        --
        Warum nennt sich Andreas hier MudGuard?
        Schreinerei Waechter
        O o ostern ...
        Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
        1. Hallo

          z.B. aus http://www.w3.org/TR/html4/sgml/sgmldecl.html
          dort steht unter DESCSET
          128     32      UNUSED

          Vielen Dank für den Link! Auch http://www.w3.org/TR/html4/sgml/entities.html ist sehr hilfreich.

          Dann sieht Apple das falsch.

          Die Notation &#146; bedeutet (in HTML genauso wie in XML), daß es sich um das Zeichen 146 (Hex: 92) aus Unicode handelt - und das ist das von mir genannte Steuerzeichen.
          Die Nummer bezieht sich immer auf Unicode, nicht auf die für das jeweilige Dokument geltende Codierung.

          Du hast absolut recht! 146 ist im ASCII-Code das Hochkomma ', nicht im Unicode. Ich werde sie mal darauf hinweisen.

          Vielen Dank für deine Hilfe

          Tom2

          1. Hi,

            Du hast absolut recht! 146 ist im ASCII-Code das Hochkomma ', nicht im Unicode. Ich werde sie mal darauf hinweisen.

            Nö. Im ASCII-Code gibt es keine Zeichen > 127.
            Auch in den ISO-Codierungen sind in dem Bereich 128 bis 159 Steuerzeichen.

            In Windows-1252 wäre das Zeichen 146 das, was in Unicode x2019 ist.
            (daß ausgerechnet Apple eine Windows-Codierung benutzt ...)

            cu,
            Andreas

            --
            Warum nennt sich Andreas hier MudGuard?
            Schreinerei Waechter
            O o ostern ...
            Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
            1. Hallo Dr. Zeichencodierung ;-)

              Du hast absolut recht! 146 ist im ASCII-Code das Hochkomma ', nicht im Unicode. Ich werde sie mal darauf hinweisen.
              Nö. Im ASCII-Code gibt es keine Zeichen > 127.

              Ich habe bei Google ASCII und 146 eingegeben und gleich das ' gesehen. Ich dachte immer, dass die hier gebräuchlichen Codierungen ASCII-Code-Erweiterungen sind. Leider kenne ich nicht alle einzeln beim Vornamen.

              In Windows-1252 wäre das Zeichen 146 das, was in Unicode x2019 ist.
              (daß ausgerechnet Apple eine Windows-Codierung benutzt ...)

              Stimmt, das ist wirklich seltsam. Wie bestimmt man den Zeichensatz, der eine Textdatei verwendet? Bei Unicode-Dateien sind ja am Anfang der Datei ein paar Bytes notiert, die die Codierung genauer bestimmen, aber wie funktioniert das bei den anderen Codes?

              Gruss

              Tom2

              1. Hi,

                Stimmt, das ist wirklich seltsam. Wie bestimmt man den Zeichensatz, der eine Textdatei verwendet? Bei Unicode-Dateien sind ja am Anfang der Datei

                ggf.

                ein paar Bytes notiert, die die Codierung genauer bestimmen,

                Der sogenannte BOM. Der kann, muß aber nicht vorhanden sein - wenn er da ist, kann man daraus erkennen, ob es UTF-8 oder UTF-16 (bigendian oder littleendian) ist.

                aber wie funktioniert das bei den anderen Codes?

                Da muß die Information aus einer anderen Quelle stammen.
                Man kann ggf. rausfinden, welche Kodierung es nicht sein kann (z.B. wenn Zeichen > 127 vorhanden, ist es kein ASCII; oder wenn bestimmte Byte-Sequenzen vorhanden sind, die in UTF-8 nicht vorkommen können, kann es kein UTF-8 sein).

                Aber ob es sich z.B. um ISO-8859-1 oder ISO-8859-2 handelt, ist am Code selbst nicht zu erkennen.

                Wenn der Text z.B. nur Byte-Sequenzen enthält, die in UTF-8 erlaubt sind, muß es aber noch lange nicht UTF-8 sein - es könnte auch ISO-8859-1 oder sonstwas sein.

                cu,
                Andreas

                --
                Warum nennt sich Andreas hier MudGuard?
                Schreinerei Waechter
                O o ostern ...
                Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
  4. Hallo Leute

    Ich hab's geschaft, mit der Eigenschaft innerHTML des DOM-Knotens!

    oNode = document.createElement('p');
    oNode.innerHTML = 'Dies ist ein <strong>Test</strong>';
    document.getElementById('content').appendChild(oNode);

    Gruss & Dank an alle

    Tom2

    1. Ich hab's geschaft, mit der Eigenschaft innerHTML des DOM-Knotens!

      oNode = document.createElement('p');
      oNode.innerHTML = 'Dies ist ein <strong>Test</strong>';
      document.getElementById('content').appendChild(oNode);

      Nur der Vollständigkeitshalber

      du hast in dem String mehrere Knoten, also  müßtest du mit DOM in etwa so arbeiten:

        
      var oNode = document.createElement('p');  
      var strong = document.createElement('strong').appendChild( document.createTextNode('Test') );  
        
      oNode.appendChild( document.createTextNode('Dies ist ein ') );  
      oNode.appendChild( strong );  
        
      document.getElementById('content').appendChild(oNode);  
      
      

      Struppi.

      --
      Javascript ist toll (Perl auch!)