Stefan Agner: Vergleichen von Strings mit Umlauten

Hallo,

Ich möchte gerne ein paar Strings mit Javascript sortieren. Das funktioniert alles wunderbar, jedoch möchte ich das die Umlaute Ä, Ü und Ö bei A, U und O eingeordnet werden! Allerdings sagt mir Javascript 'Ö' > 'Z' = true, was dazu führt dass die Strings mit einem Umlaut zuhinterst reinsortiert werden!

Gibts dazu eine elegante Lösung?

  1. Hellihello

    vermutlich wird entsprechend der Ansi-Tabelle sortiert. Wenn Du nichts vorgefertigtes findest, könntest Du selbst die Ansi-Wert auslesen (gibts bestimmt ne Funktion - bei php ists "chr()") und dann bei den fraglichen Umlauten eingreifen.

    Dank und Gruß,

    frankx

    1. Hallo,

      Vielen Dank für die Antwort!

      vermutlich wird entsprechend der Ansi-Tabelle sortiert. Wenn Du nichts vorgefertigtes findest, könntest Du selbst die Ansi-Wert auslesen (gibts bestimmt ne Funktion - bei php ists "chr()") und dann bei den fraglichen Umlauten eingreifen.

      Ich habe bereits vorher gegoogelt, und nichts entsprechendes gefunden... Sortierungen in Javascript hab ich zwar gefunden aber dort wurden Umlaute nicht speziell berücksichtigt...

      Naja, da die Texte im Browser angezeigt werden, möchte ich Sie nicht bereits auf dem Server umwandeln... Ich werd mir warscheinlich eine Funktion schreiben, welche die Umlaute durch die entsprechenden Buchstaben A, U und O ersetzt, bevor ich den vergleich in der Sortierungsfunktion mache... Oder hast du oder sonst jemand eine andere Idee?

      Gruss
      falstaff

      1. Hellihello falstaff,

        Naja, da die Texte im Browser angezeigt werden, möchte ich Sie nicht bereits auf dem Server umwandeln... Ich werd mir warscheinlich eine Funktion schreiben, welche die Umlaute durch die entsprechenden Buchstaben A, U und O ersetzt, bevor ich den vergleich in der Sortierungsfunktion mache... Oder hast du oder sonst jemand eine andere Idee?

        myChar="ö";
         alert(myChar.charCodeAt(0));

        Irgendwie zu versuchen, die in die Asciizeichen umzuwandeln.

        o ist die 111
        ö die 246

        quasi aus o eine 111.0 machen, aus ö eine 111.1, dann sortieren, dann wieder zurück.

        Aber Du erhältst ja einige Buchstaben nur zweistellig, andere dreistellig. Du müsstes Sie also alle dreistellig machen, um sie als Zahlen zu sortieren.

        Wenn dann noch dazukommt, dass du die ös innerhalb der Worte auch korrekt einsortiert haben willst, wirds noch komplexer.

        Vermutlich ist Dein Ansatz am schnellsten umgesetzt.

        Dank und Gruß,

        frankx

        1. @@frankx:

          quasi aus o eine 111.0 machen, aus ö eine 111.1,

          Nein, das ergäbe eine falsche Sortierung. „böse“ steht im Wörterbuch vor „Bote“

          Live long and prosper,
          Gunnar

          PS: BTW, bei Sortierung von Namen (Telefonbuch) werden 'ä', 'ö', 'ü' nicht wie 'a', 'o', 'u'; sondern als 'ae', 'oe', 'ue' einsortiert (in DE). [Wikipedia: Alphabetische Sortierung]

          --
          „Das Internet ist ein großer Misthaufen, in dem man allerdings auch kleine Schätze und Perlen finden kann.“ (Joseph Weizenbaum)
          1. Nein, das ergäbe eine falsche Sortierung. „böse“ steht im Wörterbuch vor „Bote“

            Ok, ersetze nun äö und ü mit ae ao und au, funktioniert wunderbar:
            String.prototype.replaceUmlaute = function() {
             return this.replace(/ä/g,'ae').replace(/ö/g,'oe').replace(/ü/g,'ue');
            }

    2. @@frankx:

      vermutlich wird entsprechend der Ansi-Tabelle sortiert.

      Nein, so beschränkt ist JavaScript nicht. Es wird nach Unicode-Codepoints sortiert.

      könntest Du selbst die Ansi-Wert auslesen (gibts bestimmt ne Funktion - bei php ists "chr()")

      Nein, im Gegenteil. Es ist ord().

      In JavaScript gibt es charCodeAt() – und wie gesagt: nicht der unsinnigen Beschränkung unterlegen wie PHP.

      Live long and prosper,
      Gunnar

      --
      „Das Internet ist ein großer Misthaufen, in dem man allerdings auch kleine Schätze und Perlen finden kann.“ (Joseph Weizenbaum)