Numero di byte utilizzando javascript textarea

Ho bisogno di contare per quanto tempo in byte di una textarea è quando UTF8 codificati utilizzando javascript. Qualsiasi idea di come io possa fare questo?

grazie!

 

10 Replies
  1. 14

    edit: come didier-l ha fatto notare, questa funzione non conta surrogato correttamente i caratteri.

    broofa la risposta dovrebbe contare surrogati correttamente, vedere https://stackoverflow.com/a/12206089/274483.

    Ho provato le due versioni proposte qui, come un ingenuo attuazione:

     getUTF8Length: function(string) {
        var utf8length = 0;
        for (var n = 0; n < string.length; n++) {
            var c = string.charCodeAt(n);
            if (c < 128) {
                utf8length++;
            }
            else if((c > 127) && (c < 2048)) {
                utf8length = utf8length+2;
            }
            else {
                utf8length = utf8length+3;
            }
        }
        return utf8length;
     }

    Con il risultato che la mia versione è leggermente più veloce di firefox e significativamente più veloce di chrome (~x 30) di qui postato versioni.

    • Non credo che questa implementazione è corretto poiché conta caratteri surrogati due volte: una volta quando incontra l’alta surrogato, poi una volta quando incontrando il basso. Per esempio, il seguente restituisce 6: getUTF8Length(Stringa.fromCharCode(0xD800, 0xDC00)), anche se questo rappresenta un singolo carattere (devo ammettere di non so quale, ho appena combinato 2 surrogato char codici…). Non sono un esperto in unicode, anche se…
    • L, sì, hai ragione! Dovrebbe essere aggiunto alla lista dei casi e di essere rappresentato
  2. 18
    encodeURIComponent(text).replace(/%[A-F\d]{2}/g, 'U').length
    • Questo è piuttosto liscia. L’unico problema è che genererà se la stringa contiene un valido surrogato modello. E. g. encodeURIComponent('\ud800a'). Solo qualcosa di cui essere consapevoli.
    • Come si può inserire nella textarea una stringa che contiene un valido surrogato del modello? Ho provato ad inserire il testo ‘\ud800a’ per questo pagina di prova (che utilizza encodeURI -funzione internamente per codificare il testo inserito), ma non riuscivo a riprodurre una situazione di errore invece ho visto: document.getElementsByTagName("textarea")[0].value === "\\ud800a".
    • Utilizzato per il conteggio della lunghezza della stringa UTF-8.
    • risposta tardiva, ma per rispondere alla tua domanda, una textarea di accettare le stringhe non valide. E. g. textarea.value = '\ud800' && encodeURIComponent(textarea.value) buttare (almeno, in Chrome sarà).
  3. 17

    Combinando le varie risposte, il metodo riportato di seguito deve essere veloce e preciso, e si evitano problemi con voci di coppie di surrogati che possono causare errori nel encodeURIComponent():

    function getUTF8Length(s) {
      var len = 0;
      for (var i = 0; i < s.length; i++) {
        var code = s.charCodeAt(i);
        if (code <= 0x7f) {
          len += 1;
        } else if (code <= 0x7ff) {
          len += 2;
        } else if (code >= 0xd800 && code <= 0xdfff) {
          //Surrogate pair: These take 4 bytes in UTF-8 and 2 chars in UCS-2
          //(Assume next char is the other [valid] half and just skip it)
          len += 4; i++;
        } else if (code < 0xffff) {
          len += 3;
        } else {
          len += 4;
        }
      }
      return len;
    }
  4. 14

    Se si dispone di non bmp caratteri in una stringa, è un po ‘ più complicato…

    Perché javascript non UTF-16 codificare, e un “personaggio” è un 2-byte-stack (16 bit) tutti i caratteri multibyte (3 byte) non funziona:

        <script type="text/javascript">
            var nonBmpString = "foo€";
            console.log( nonBmpString.length );
            //will output 5
        </script>

    Il carattere “€” ha una lunghezza di 3 byte (24 bit). Javascript viene interpretato come 2 caratteri, perché in JS, un personaggio che è a 16 bit di blocco.

    Così correttamente il bytesize di un misto di stringa, dobbiamo codice nostri funzione fixedCharCodeAt();

        function fixedCharCodeAt(str, idx) {
            idx = idx || 0;
            var code = str.charCodeAt(idx);
            var hi, low;
            if (0xD800 <= code && code <= 0xDBFF) { //High surrogate (could change last hex to 0xDB7F to treat high private surrogates as single characters)
                hi = code;
                low = str.charCodeAt(idx + 1);
                if (isNaN(low)) {
                    throw 'Kein gültiges Schriftzeichen oder Speicherfehler!';
                }
                return ((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000;
            }
            if (0xDC00 <= code && code <= 0xDFFF) { //Low surrogate
                //We return false to allow loops to skip this iteration since should have already handled high surrogate above in the previous iteration
                return false;
                /*hi = str.charCodeAt(idx-1);
                low = code;
                return ((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000;*/
            }
            return code;
        }

    Ora possiamo contare i byte…

        function countUtf8(str) {
            var result = 0;
            for (var n = 0; n < str.length; n++) {
                var charCode = fixedCharCodeAt(str, n);
                if (typeof charCode === "number") {
                    if (charCode < 128) {
                        result = result + 1;
                    } else if (charCode < 2048) {
                        result = result + 2;
                    } else if (charCode < 65536) {
                        result = result + 3;
                    } else if (charCode < 2097152) {
                        result = result + 4;
                    } else if (charCode < 67108864) {
                        result = result + 5;
                    } else {
                        result = result + 6;
                    }
                }
            }
            return result;
        }

    Dal modo in cui…
    Non si deve usare il encodeURI-metodo, perché si tratta di un browser nativo funzione 😉

    Più roba:


    Applausi

    frankneff.ch / @frank_neff
    • Ciao Frank, ho usato il tuo metodo e funziona correttamente per il multi byte char stringhe. ho un campo di testo dove ho bisogno di contare i caratteri / bytes non appena i tipi di utente. Ho provato il tasto premere evento, ma non licenziato quando facciamo copia / incolla. Si può, si prega di suggerire alcuni affidabile & efficace per il conteggio di byte, mentre i tipi di utente? Ho bisogno di mostrare un conteggio come “300 sinistra..” Grazie & per quanto riguarda, Nadeem
    • Non c’è bisogno per la else if (charCode < 67108864) {} bit e il else che segue. Unicode si ferma a U+10FFFF ed è impossibile rappresentano un punto di codice Unicode in JavaScript.
    • Questo è vero, secondo il RFC3629 specifica. Ma la specifica originale consente fino a sei caratteri a byte. Io non sono sicuro di attuazione devono essere rispettati, ma direi che questa è la soluzione corretta.
    • JavaScript utilizza UTF-16*, però, che non può rappresentare codepoint (quelli che non esistono) sopra U+10FFFF comunque.
    • Cosa c’è di sbagliato con l’utilizzo di un browser nativo funzione?
  5. 2

    Aggiungere lunghezza in Byte della funzione di conteggio per la stringa

    String.prototype.Blength = function() {
        var arr = this.match(/[^\x00-\xff]/ig);
        return  arr == null ? this.length : this.length + arr.length;
    }

    quindi è possibile utilizzare .Blength() per ottenere la dimensione

  6. 0

    Che mi chiedo la stessa cosa. Questa è la migliore risposta che mi sono inciampare su:

    http://www.inter-locale.com/demos/countBytes.html

    Qui è il frammento di codice:

    <script type="text/javascript">
     function checkLength() {
        var countMe = document.getElementById("someText").value
        var escapedStr = encodeURI(countMe)
        if (escapedStr.indexOf("%") != -1) {
            var count = escapedStr.split("%").length - 1
            if (count == 0) count++  //perverse case; can't happen with real UTF-8
            var tmp = escapedStr.length - (count * 3)
            count = count + tmp
        } else {
            count = escapedStr.length
        }
        alert(escapedStr + ": size is " + count)
     }

    ma il link contiene un esempio vivo per giocare assieme. “encodeURI(STRINGA)” è il blocco di costruzione di qui, ma guardare anche encodeURIComponent(STRING) (come già in risposta precedente) per vedere quale si adatta alle vostre esigenze.

    Riguarda

  7. -1

    Provare le seguenti:

    function b(c) {
         var n=0;
         for (i=0;i<c.length;i++) {
               p = c.charCodeAt(i);
               if (p<128) {
                     n++;
               } else if (p<2048) {
                     n+=2;
               } else {
                     n+=3;
               }
          }return n;
    }
  8. -1

    set meta UTF-8 a soli & OK!

    <meta charset="UTF-8">
    <meta http-equiv="content-type" content="text/html;charset=utf-8">

    e js:

    if($mytext.length > 10){
     //its okkk :)
    }

Lascia un commento