Pauer: Zeichen zählen - Problem mit Umlauten

Hallo,

ich habe ein TinyMCE-Feld, bei dem ich die Zeichen zähle und auf 500 Zeichen begrenze. Das funktioniert, nur werden bspw. Umlaute als 6 Zeichen gezählt. Alle Dateien sind UTF-8.

Wie kann ich es erreichen, dass die Umlaute nur als ein Zeichen gezählt werden?

Gruß Pauer

tinymce.init({  
  selector: "#description",  
  toolbar: "bold italic underline",  
  menubar : false,  
  statusbar : false,  
  // count and display numnber of chars  
  setup : function(ed) {  
    ed.on('keydown', function(evt) {  
      var tinylen,  
          remaining,  
          maxlength = $("#" + tinyMCE.activeEditor.id).attr("maxlength");  
				  
      if (maxlength) {  
        tinylen = ed.getContent().replace(/(<([^>]+)>)/ig,"").length;  
        remaining = (maxlength - tinylen) >= 0 ? (maxlength - tinylen) : 0 ;  
        if (tinylen > maxlength-1) {  
          // allow only following keys:  
          if(evt.keyCode != 8         // backspace  
              && evt.keyCode != 16    // shift  
              && evt.keyCode != 17    // ctrl  
              && evt.keyCode != 18    // alt  
              && evt.keyCode != 37    // left arrow  
              && evt.keyCode != 38    // up arrow  
              && evt.keyCode != 39    // right arrow  
              && evt.keyCode != 40    // down arrow  
              && evt.keyCode != 46) { // delete  
            return tinymce.dom.Event.cancel(evt);  
           }  
         }  
         if(remaining != 500 && remaining!= 0)  
           remaining -=1;  
         $('.cnt-chars span').text(remaining);  
      }  
    });  
  },  
});
  1. Mahlzeit,

    nur werden bspw. Umlaute als 6 Zeichen gezählt. Alle Dateien sind UTF-8.

    Ich gehe mal davon aus, die Umlaute werden in Entities umgewandelt, also Ä => &Auml;
    Versuch mal ein

    entity_encoding : "raw",

    in der Config von tinymce

    --
    42
    1. Hallo,

      Versuch mal ein
      entity_encoding : "raw",
      in der Config von tinymce

      Man, man, man, danke das wars, Wald und Bäume und so...

      Gruß Pauer

  2. Hallo,

    Alle Dateien sind UTF-8.

    Das spielt eigentlich keine Rolle mehr, wenn erst einmal alle Dateien eingelesen sind.

    tinylen = ed.getContent().replace(/(<([^>]+)>)/ig,"").length;

    Strings in JavaScript sind echte Ketten von Unicode-Zeichen, sie stellen deutsche Umlaute problemlos in einem Zeichen da.

    "ö".length → 1

    Problematisch wird das erst mit Zeichen außerhalb des Basic Multilingual Plane von Unicode:
    http://mathiasbynens.be/notes/javascript-unicode
    Dann ist der Wert von length ggf. inkorrekt.

    Ich weiß natürlich nicht, was TinyMCE in getContent macht. Vielleicht wird ö durch &ouml; ersetzt? Schau dir den String einmal an, werden da irgendwelche Ersetzungen vorgenommen?

    Mathias

    1. @@molily:

      nuqneH

      Strings in JavaScript sind echte Ketten von Unicode-Zeichen, sie stellen deutsche Umlaute problemlos in einem Zeichen da.

      "ö".length → 1

      "ö".length → 2

      Problematisch wird das erst mit Zeichen außerhalb des Basic Multilingual Plane von Unicode

      Nö, das schon in der BMP problematisch.

      Dann ist der Wert von length ggf. inkorrekt.

      Was er ggf. schon für Zeichen der BMP ist. Wobei man erstmal definieren müsste, was für "ö" (o U+0308 COMBINING DIAERESIS) denn nun korrekt wäre: 1 oder 2. (Normalisierung)

      Qapla'

      --
      „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
      1. Hallo,

        Problematisch wird das erst mit Zeichen außerhalb des Basic Multilingual Plane von Unicode:
        http://mathiasbynens.be/notes/javascript-unicode

        Nö, das schon in der BMP problematisch.

        Das ist richtig. Das erklärt der Link, den ich aus Gründen gesetzt hatte und den du aus dem Zitat entfernt hast, auch in epischer Breite. Ich habe ihn in obigem Zitat noch einmal ergänzt. Ich hatte nicht den Anspruch, die Problematik in 12 Wörtern wiederzugeben. Als ich von deutschen Umlauten sprach, dann bezog ich mich auf einzelne, nicht zusammengesetzte Unicode-Zeichen wie U+00F6.

        Mathias