atreiu: Unicode escape Sequenz in Strings umwandeln

Schönen Abend zusammen,

ich bekomme über eine API Strings geliefert, die Unicode-Escape-Sequenzen als String, nicht als Unicode-Zeichen enthalten:

z.B. lautet ein String "Die \u041Erzte" statt "Die Ärzte" oder "Die %C4rzte".

Wie kann ich nun alle solche Escape-Sequenzen in Unicode-Zeichen umwandeln?
un-/escape() funktioniert hier ja leider nicht.

Danke & Viele Grüße, Atreiu.

  1. Hi,

    z.B. lautet ein String "Die \u041Erzte" statt "Die Ärzte" oder "Die %C4rzte".

    \u041 gibt's gar nicht, \u0041 waere A.
    \u00c4 waere das Ä, welches du meinst.

    Wie kann ich nun alle solche Escape-Sequenzen in Unicode-Zeichen umwandeln?

    Wie meinen?
    Wozu willst du die "umwandeln"?
    Wenn JavaScript die in dieser Form vorgesetzt bekommt, dann "ist" das fuer JavaScript doch "automatisch" ein Ä.

    MfG ChrisB

    --
    „This is the author's opinion, not necessarily that of Starbucks.“
    1. Hi,

      z.B. lautet ein String "Die \u041Erzte" statt "Die Ärzte" oder "Die %C4rzte".

      \u041 gibt's gar nicht, \u0041 waere A.
      \u00c4 waere das Ä, welches du meinst.

      \u041E gibt es sehr wohl (das E gehört natürlich noch zum hex-code):
      http://www.utf8-zeichentabelle.de/unicode-utf8-table.pl?start=1024
      (Allerdings ist es kein Ä wie ich dachte, sondern ein kyrillisches Zeichen. Das kann sein, weil es sich um eine russische API handelt. Vermutlich ist da die API fehlerhaft. Der korrekte Code wäre /u00C4)

      Nichts desto trotz, meine Frage bleibt die Gleiche:

      Wie kann ich nun alle solche Escape-Sequenzen in Unicode-Zeichen umwandeln?

      Wie meinen?
      Wozu willst du die "umwandeln"?
      Wenn JavaScript die in dieser Form vorgesetzt bekommt, dann "ist" das fuer JavaScript doch "automatisch" ein Ä.

      Das dachte ich vorher auch, aber es ist wohl nicht so. Javascript scheint die Escape-Sequenz nur aufzulösen, wenn sie innerhalb von Javascript geschrieben wird, aber nicht wenn man einen String aus einer externen Quelle (in meinem Fall ein xml-file) ausliest.
      Beispiel:

      var str1 = "Die /u00C4rzte";
      var str2 = meinXMLKnoten.nodeValue; // Der Wert des Knotens ist "Die /u00C4rzte"
      alert(str1+'-'+str2);

      ergibt erstaunlicher Weise die Meldung "Die Ärzte - Die /u00C4rzte".

      Gruß, Atreiu

      1. Hi,

        var str1 = "Die /u00C4rzte";
        var str2 = meinXMLKnoten.nodeValue; // Der Wert des Knotens ist "Die /u00C4rzte"
        alert(str1+'-'+str2);

        ergibt erstaunlicher Weise die Meldung "Die Ärzte - Die /u00C4rzte".

        Nein, tut's nicht.
        Das ergibt "Die /u00C4rzte - Die /u00C4rzte".
        / != \

        MfG ChrisB

        --
        „This is the author's opinion, not necessarily that of Starbucks.“
        1. Nein, tut's nicht.
          Das ergibt "Die /u00C4rzte - Die /u00C4rzte".
          / != \

          MfG ChrisB

          Sorry, Schreibfehler. Ich meinte "" :-D Mit "" bekomme ich es auch von der API übermittelt.

          1. Hi,

            Sorry, Schreibfehler. Ich meinte "" :-D Mit "" bekomme ich es auch von der API übermittelt.

            Nun, wenn du ein XML-Dokument einliest, dann ist der Kontext, in dem der Text ausgewertet wird, ja zunaechst mal nicht JavaScript - also gibt es da auch keinen Grund, solch eine Zeichenreferenz aufzuloesen.

            Wie sieht's denn aus, wenn du den nodeValue des Knotens mal nimmst, und mit + einen Leerstring hinten dran haengst - damit wuerde man JS ja zwingen, beides als JS-Strings zu "verarbeiten".
            Oder auch aus dem nodeValue mit new String() mal ein neues String-Objekt erzeugen.

            MfG ChrisB

            --
            „This is the author's opinion, not necessarily that of Starbucks.“
            1. Wie sieht's denn aus, wenn du den nodeValue des Knotens mal nimmst, und mit + einen Leerstring hinten dran haengst - damit wuerde man JS ja zwingen, beides als JS-Strings zu "verarbeiten".
              Oder auch aus dem nodeValue mit new String() mal ein neues String-Objekt erzeugen.

              Habs mal probiert:
              var Str1 = meinXMLKnoten.nodeValue+' ';
              var Str2 = new String(meinXMLKnoten.nodeValue);
              var Str3 = 'Die \u041Erzte';
              alert(Str1+'-'+Str2+'-'+Str3);

              Leider wird wieder nur Str3 aufgelöst :-(

  2. Wie kann ich nun alle solche Escape-Sequenzen in Unicode-Zeichen umwandeln?

    var string = "\\u00C4";  
    var newstring = string.[ref:self812;javascript/objekte/string.htm#replace@title=replace](  
      /\\u([0-9a-fA-F]{4})/,  
      function (match, submatch) {  
        return String.[ref:self812;javascript/objekte/string.htm#from_char_code@title=fromCharCode]([ref:self812;javascript/objekte/unabhaengig.htm#parse_int@title=parseInt](submatch, 16));  
      }  
    );
    

    Mathias

    1. var string = "\u00C4";

      var newstring = string.[ref:self812;javascript/objekte/string.htm#replace@title=replace](
        /\u([0-9a-fA-F]{4})/,
        function (match, submatch) {
          return String.[ref:self812;javascript/objekte/string.htm#from_char_code@title=fromCharCode]([ref:self812;javascript/objekte/unabhaengig.htm#parse_int@title=parseInt](submatch, 16));
        }
      );

        
      Dankeschön! Das funktioniert, der Abend ist gerettet! :-)
      
    2. Hallo Mathias,

      /\u([0-9a-fA-F]{4})/,

      /\\u([0-9a-f][link:http://en.wikipedia.org/wiki/Basic_Multilingual_Plane#Supplementary_Multilingual_Plane@title=+])/[link:http://de.selfhtml.org/perl/sprache/regexpr.htm#flags@title=gi]

      Tim

      --
      (Ok, die Nicht-Begrenzung auf UTF-16 ist übertrieben. Allerdings gibt es Sprachen, in denen Unicode-Maskierungs-Sequenzen länger sein dürfen. Wer weiß schon, was da den falsch ausgespuckten String generiert.)
      1. Hi,

        /\u([0-9a-fA-F]{4})/,

        /\\u([0-9a-f][link:http://en.wikipedia.org/wiki/Basic_Multilingual_Plane#Supplementary_Multilingual_Plane@title=+])/[link:http://de.selfhtml.org/perl/sprache/regexpr.htm#flags@title=gi]

        Nein, die {4} solltest du schon drin lassen - sonst hast du bei \u00C4abc... ein Problem.

        MfG ChrisB

        --
        „This is the author's opinion, not necessarily that of Starbucks.“
        1. Hi,

          /\u([0-9a-fA-F]{4})/,

          /\\u([0-9a-f][link:http://en.wikipedia.org/wiki/Basic_Multilingual_Plane#Supplementary_Multilingual_Plane@title=+])/[link:http://de.selfhtml.org/perl/sprache/regexpr.htm#flags@title=gi]

          Nein, die {4} solltest du schon drin lassen - sonst hast du bei \u00C4abc... ein Problem.

          MfG ChrisB

          Oh, aber der global-switch ist keine schlechte Idee, oder? Wird sonst nicht nur das erste Vorkommen ersetzt?

          /\u([0-9a-fA-F]{4})/g

          (Aber bin mir nicht sicher, ob ich die Funktion von global verstanden habe...)

          Gruß, Atreiu

          1. Hallo Phantásier,

            Oh, aber der global-switch ist keine schlechte Idee, oder? Wird sonst nicht nur das erste Vorkommen ersetzt?
            (Aber bin mir nicht sicher, ob ich die Funktion von global verstanden habe...)

            Doch, genauso; das war eigentlich nur Grund meiner Anmerkung. ;)

            Tim

        2. Hallo Christoph,

          Nein, die {4} solltest du schon drin lassen - sonst hast du bei \u00C4abc... ein Problem.

          Siehe auch meine Signatur. ;)

          Aber trotzdem: Wenn man schon davon ausgehen muss, dass der Programmierer der API Mist gebaut hat, kann man sich fragen, was passiert, über diese API 𝔪𝔞𝔱𝔥𝔢𝔪𝔞𝔱𝔦𝔰𝔠𝔥𝔢 𝔉𝔯𝔞𝔨𝔱𝔲𝔯 käme. Oder einfach zehnzeichige Escapes in UTF-32 für stinknormale Buchstaben.

          Tim

          1. Hi,

            Nein, die {4} solltest du schon drin lassen - sonst hast du bei \u00C4abc... ein Problem.

            Siehe auch meine Signatur. ;)

            Aber trotzdem: Wenn man schon davon ausgehen muss, dass der Programmierer der API Mist gebaut hat,

            Wieso Mist gebaut?

            kann man sich fragen, was passiert, über diese API 𝔪𝔞𝔱𝔥𝔢𝔪𝔞𝔱𝔦𝔰𝔠𝔥𝔢 𝔉𝔯𝔞𝔨𝔱𝔲𝔯 käme. Oder einfach zehnzeichige Escapes in UTF-32 für stinknormale Buchstaben.

            Gibt's sowas in JavaScript?

            MfG ChrisB

            --
            „This is the author's opinion, not necessarily that of Starbucks.“
            1. Hallo,

              Wieso Mist gebaut?

              Er packt Unicode Escape Sequenzen in der Form "\uXXXX" in ein Textformat, das für
              Maskierung von Zeichen die Form "&xXXXX;" vorsieht.

              Gibt's sowas in JavaScript?

              Ich bezweifele, dass die serverseitige API mittels Javascript betrieben wird, in dem die Zeichenmaskierungen ja auf "\uXXXX" standardisiert sind. Woanders gibt es andere Formate und andere Einschränkungen – oder Nicht-Einschränkungen. In CSS sind z.B. die Maskierungen der Form "\nnnnn..." von \20 bis (mit Lücken) \10FFFF erlaubt, Länge variabel.

              Tim

              1. Hi,

                Wieso Mist gebaut?

                Er packt Unicode Escape Sequenzen in der Form "\uXXXX" in ein Textformat, das für Maskierung von Zeichen die Form "&xXXXX;" vorsieht.

                So gesehen ... ist das ein Argument :-)

                MfG ChrisB

                --
                „This is the author's opinion, not necessarily that of Starbucks.“
      2. Allerdings gibt es Sprachen, in denen Unicode-Maskierungs-Sequenzen länger sein dürfen. Wer weiß schon, was da den falsch ausgespuckten String generiert.

        Ja stimmt, ich habe mich ohne Grund an ECMAScripts Escape-Sequenzen gehalten. Bevor man da JavaScript-seitig irgendwas parst, sollte man sich über die fragliche API informieren, die nach unbekannten Regeln maskiert.

        Mathias