Andreas: Umlaute umwandeln

Hallo zusammen,

ich möchte gerne Umlaute umwandeln:

var neu = txt.replace(/ö/g,"oe");

Leider funktioniert das bei mir nicht. Den Text greife ich von der Seite ab, kann das ein Problem der Seitenkodierung sein (UTF8)?

Danke im Voraus!

  1. Hi,

    ich möchte gerne Umlaute umwandeln:

    var neu = txt.replace(/ö/g,"oe");

    Leider funktioniert das bei mir nicht.

    javascript:alert("öhö!".replace(/ö/g,"oe"));
    in der Adresszeile des Browsers eingegeben zeigt, dass es so "funktioniert".

    Den Text greife ich von der Seite ab, kann das ein Problem der Seitenkodierung sein (UTF8)?

    Oder mit der Kodierung des Scriptes selber.
    Oder mit der Art, wie du den Text "abgreifst".

    MfG ChrisB

    --
    „This is the author's opinion, not necessarily that of Starbucks.“
  2. Moin!

    ich möchte gerne Umlaute umwandeln:

    var neu = txt.replace(/ö/g,"oe");

    Leider funktioniert das bei mir nicht. Den Text greife ich von der Seite ab, kann das ein Problem der Seitenkodierung sein (UTF8)?

    Ja, natürlich. Aber denk auch daran, dass auch dein Javascript-Code eine Codierung hat, die zählt!

    Eine HTML-Seite hat hinsichtlich ihrer Codierung immer Recht. Wenn der Browser korrekte Umlaute anzeigt, stimmt dort alles - egal was als Codierung angegeben ist. Der Browser nimmt die Bytes der HTML-Seite, checkt die Codierung, und wandelt auf dieser Basis alle Zeichen in eine interne Darstellform für Unicode-Zeichen um. Auch Entities und numerische Zeichenreferenzen werden in diesem Schritt wieder zu den Originalzeichen zurückgewandelt.

    Dein Javascript hat ebenfalls eine Codierung, nämlich die, mit der dein Editor die eingegebenen Schriftzeichen gespeichert hat. Bei Scripten, die in der HTML-Seite enthalten sind, gibts keine Abweichungen: Das Skript ist genau so codiert, wie das HTML. Ein eingebenes "ö" ist also in beiden Teilen identisch codiert, wird vom Browser identisch in die interne Unicode-Darstellung umgewandelt, und deswegen findet der Regex auch das korrekte, weil gleiche, Zeichen "ö".

    Externe Skripte können abweichende Codierungen haben. Wenn der Server die Codierung allerdings nicht mitteilt, kann der Browser anfangen, zu raten.

    Solche Ratespielchen stören bei Javascript in den meisten Fällen nicht, da der Programmcode ja sowieso nur mit Zeichen geschrieben ist, die in allen Codetabellen identisch sind, egal ob UTF-8. ISO-8859-1, -2, -3, -4, -5,... Windows-1252, etc.

    Aber wenn dein Browser denkt, er kann das Javascript als UTF-8 interpretieren, und du hast in Wirklichkeit die Datei als ISO-8859-1 gespeichert, dann steht im Programmcode ein ISO-"ö" bzw. genauer das Byte eines ISO-"ö" - und das kann der Browser, der die UTF-8-Tabelle benutzt, mit dieser Tabelle nicht als ein Unicode-"ö" erkennen. Deshalb findet der Regex dann nicht die in der Seite enthaltenen "ö", weil er nach etwas vollkommen anderem sucht.

    Dem Server beizubringen, auch für Javascript-Dateien eine Encoding-Angabe mitzuliefern, wird das Problem sicherlich beheben, wenn dann noch das Encoding dieser Dateien korrekt ist.

    - Sven Rautenberg

    --
    "Love your nation - respect the others."
    1. Vielen Dank für die ausführliche Beschreibung, das habe ich implizit auch unterstellt. Allerdings habe ich das Skript in dieselbe Seite mit eingebunden, ergo müsste es nach Deiner Beschreibung funktionieren.

      Ich habe dann auch den Übeltäter gefunden: ich hole den Text per jQuery aus dem DOM. Keine Ahnung was jQuery macht, jedenfalls scheint danach eine Abweichung in der Codierung vorzuliegen.
      Jedenfalls hat alles ordnungsgemäß geklappt nachdem ich jQuery ausgelassen habe.
      Ich habe mich dann dazu entschlossen den Code von Jürgen zu erweitern.

      Vielen Dank und viele Grüße,
      Andreas

  3. Hallo Andreas,

    ich benutze folgenden Ausdruck:

    X.replace(/\u00e4/g,"ae").replace(/\u00f6/g,"oe").replace(/\u00fc/g,"ue").replace(/\u00df/g,"ss");

    Gruß, Jürgen

    1. Hallo Jürgen,

      super, vielen Dank, das hat geklappt. Ich habe Deinen Code noch etwas erweitert (Großbuchstaben):

        
             function replaceUmlauts(string, index){  
            var anArray = new Array(2);  
            anArray[0] = new Array("\u00d6", "\u00f6", "\u00c4", "\u00e4", "\u00dc", "\u00fc", "\u00df");  
            anArray[1] = new Array("Oe", "oe", "Ae", "ae", "Ue", "ue", "ss");  
        
            for (var i=0; i<anArray[index].length; i++){  
          myRegExp = new RegExp(anArray[index][i],"g");  
          string = string.replace(myRegExp, anArray[(index==0?1:0)][i]);  
         }  
            return string;  
        }