Michael: ISO 10646 und nodeValue()

hi all!

ich moechte gerne mit nodeValue() den inhalt eines nodes (<a>) dynamisch setzen. das klappt eigentlich wunderbar.

nur habe ich dabei das problem, dass html-gerechte umlaute wie "&#252;" nicht als "ü" dargestellt werden, sondern eben als "&#252;"!

[snip]
var text = new Array();
text[0]="non-escaped ü ..";
text[1]="html-escaped &#252; ..")
document.getElementById("bla").firstChild.nodeValue = text[1]
[snip]
<a id="bla">bla</a>
[snip]

getestet mit mozilla 0.9.8 und IE 5.50 => dasselbe verhalten.
in den html-headers steht content type ISO-8859-1

wie kann ich ihm beibringen diese zeichen "richtig" darzustellen?

danke im voraus fuer ideen.

gruss
 - Michael -

  1. Hi

    nur habe ich dabei das problem, dass html-gerechte umlaute wie "&#252;" nicht als "ü" dargestellt werden, sondern eben als "&#252;"!

    das ist auch richtig so, da "&#252;" als Zeichenkette repräsentiert
    wird. Du darfst die Funktion nicht mit document.write verwechseln!!
    und solange du im western-latin 1 unterwegs bist, ist das mit den
    Umlauten kein Problem. Ärger gibt es nur, wenn du zeichen aus
    verschieden Zeichensätzen verwenden willst. Abhilfe schafft Folgendes:

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

    <html>
    <head>
     <title>Untitled</title>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
     <script>
     function wechsel() {
      var text = new Array();
      text[0]="non-escaped ü ..";
      text[1]="html-escaped &#252; ..";
      document.getElementById("bla").firstChild.nodeValue = text[0];
     }
     </script>
    </head>

    <body>

    <a id="bla" href="javascript:void()" onclick="wechsel()">bla</a>

    </body>
    </html>

    teste ie6 und mozill098

    bye eddie

    1. hi edi

      nur habe ich dabei das problem, dass html-gerechte umlaute wie "&#252;" nicht als "ü" dargestellt werden, sondern eben als "&#252;"!

      das ist auch richtig so, da "&#252;" als Zeichenkette repräsentiert
      wird. Du darfst die Funktion nicht mit document.write verwechseln!!
      und solange du im western-latin 1 unterwegs bist, ist das mit den
      Umlauten kein Problem. Ärger gibt es nur, wenn du zeichen aus
      verschieden Zeichensätzen verwenden willst. Abhilfe schafft Folgendes:

      [snip]

      danke fuer den code! leider funktioniert es nur mit text[0], ich suche aber eine loesung wenn ich zeichenketten in "&#252;"-form habe, wie in text[1]... welches document-encoding muss ich denn da benutzen?

      gruss
       - Michael -

      1. Hi Michael,

        du hast dir -mit verlaub- ein sche..ßproblem rausgesucht.

        Es ist in JavaScript lösbar, aber mit welchem aufwand.
        Ich vermute du must text, der in einer datenbank hängt und bereits
        entities enthält in html umwandeln? Warum du das nicht dirket in die
        Htmlseite reinschreiben kannst ist mir nicht klar aber du wirst deine
        erklärung haben ;-)

        Was ist zu tun?
        1. den verantwortlichen dafür finden, dass die dinger als unflexible
           und platzfressende entities in der datenbank sind. Diesen jemand
           nachdrücklich körperlich verwarnen ;-)
        2. Entscheidung treffen ob serverseitig oder clientseitig arbeiten
           a) serverseitig ist meist schneller bei großen texten
           b) ist flexibler im umgang mit unicode

        Da du mit DOM-kompatiblen scripts arbeitest, sollten alle Browser für
        die du das script machst auch die erweiterte replace function
        beherrschen (außer vermutlich Opera grrrrrrr....)

        folgendes könnte helfen
        <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

        <html>
        <head>
         <title>Untitled</title>
         <meta http-equiv="Content-Type" content="text/html; charset=iso-8559-1">
         <script>
         function wechsel() {
          txt = "zu ersetzender Text mit &#196;rgerstifter";
          matcher =  /&#([0-9]{2,5});/g
          txt = txt.replace(matcher ,
               function killThem(whole,numb) {
                return String.fromCharCode(parseInt(numb));
               }
               );
          document.getElementById("bla").firstChild.nodeValue = txt;
         }
         </script>
        </head>

        <body>

        <a id="bla" href="javascript:void(0)" onclick="wechsel()">bla</a>

        </body>
        </html>

        danke fuer den code! leider funktioniert es nur mit text[0], ich suche aber eine loesung wenn ich zeichenketten in "&#252;"-form habe, wie in text[1]... welches document-encoding muss ich denn da benutzen?

        obenstehender Code funktioniert nur für dezimal unicode encodierte
        Entities. Sollte das Mit hexadezimal codierten gemischt sein, würde
        ich den Verantwortlichen nicht nur verwarnen :-)) + <eg>

        bye eddie

  2. Hallo Allerseits

    Aus der HTML-Spezifikation:

    <!ENTITY % Script "CDATA" -- script expression -->
    <!ELEMENT SCRIPT - - %Script; -- script statements -->

    * CDATA is a sequence of characters from the document character set and may include character entities. User agents should interpret attribute values as follows:
              * Replace character entities with characters,
              * Ignore line feeds,
              * Replace each carriage return or tab with a single space.

    Somit müsste es eigentlich ersetzt werden.
    Da in JavaScript allerdings sehr oft & verwendet wird, werden Entities nichtmal von Mozilla ersetzt.
    Außer man verwendet XHTML mit contenttype text/xml.
    Entities zu ersetzen, würde ziemlich viele Scripts nicht mehr lauffähig machen.

    Grüße

    Daniel

    1. hi daniel

      * CDATA is a sequence of characters from the document character set and may include character entities. User agents should interpret attribute values as follows:
                * Replace character entities with characters,
                * Ignore line feeds,
                * Replace each carriage return or tab with a single space.

      Somit müsste es eigentlich ersetzt werden.
      Da in JavaScript allerdings sehr oft & verwendet wird, werden Entities nichtmal von Mozilla ersetzt.

      danke fuer die aufklaerung!

      sieht so aus als muesste ich entitaeten wieder zurueckwandeln bevor ich sie in <script>s gebrauche. hmm da werd ich wohl etwas in perl basteln muessen...

      Außer man verwendet XHTML mit contenttype text/xml.
      Entities zu ersetzen, würde ziemlich viele Scripts nicht mehr lauffähig machen.

      ja und wegen dem kleinen wort "should" kann ich nicht mal einen bug aufmachen im bugzilla.mozilla.org ;)

      gruss
       - Michael -