Domanda

Ho bisogno di provare a stimare il disco dimensioni di una stringa di testo (che potrebbe essere il testo crudo o un Base64 codificato stringa per un'immagine / audio / etc) in JavaScript. Non sono sicuro di come stimare questo. L'unica cosa in cui Googling che posso trovare è .length così ho pensato che forse qualcuno StackOverflow potrebbe sapere ...

Il motivo ho bisogno di sapere è che ho uno script localStorage che le esigenze (o vorrebbero avere) la capacità di controllare quando un utente si sta avvicinando il suo 5 MB (o 10 MB in IE) quote e tempestiva loro di aumentare la dimensione massima per il dominio. Quindi, se un utente colpi, consente di dire, 4.5MBs di dati che sarebbe pronta con

  

Si sta avvicinando il vostro browser tappo di dati 5MB. Si prega di aumentare i dati di max da ... [istruzioni su aumentandola per il browser]

È stato utile?

Soluzione

Non sarà esatto, ma si può contare il numero di byte in una stringa per ottenere una stima approssimativa.

function bytes(string) {
    var escaped_string = encodeURI(string);
    if (escaped_string.indexOf("%") != -1) {
        var count = escaped_string.split("%").length - 1;
        count = count == 0 ? 1 : count;
        count = count + (escaped_string.length - (count * 3));
    }
    else {
        count = escaped_string.length;
    }

return count;

}

var mystring = 'tâ'; alert(bytes(mystring));

Altri suggerimenti

Si sta per dipendere dalla vostra codifica dei caratteri. Se si utilizza la codifica ASCII, che sta per essere byte str.length. Se si utilizza UTF-16, che sta per essere (str.length * 2) byte. Se si utilizza UTF-8, si sta andando a dipendere dai caratteri della stringa. (Alcuni personaggi prenderanno solo 1 byte, ma altri potrebbero richiedere fino a 4 byte). Se hai a che fare con i dati con codifica Base64, i personaggi sono tutti all'interno della gamma ASCII e quindi occuperebbero str.length byte su disco. Se li decodificare prima e salvare in formato binario, ci vorrebbe (str.length * 3/4) byte. (Con Base64, 3 byte codificati diventano 4 byte codificati.)

A proposito - (! No Excuses) Se non avete letto Joel Spolsky di Il Developer Absolute minimo Ogni software assolutamente, positivamente deve sapere Unicode e set di caratteri , si dovrebbe farlo immediatamente

http://www.joelonsoftware.com/articles/Unicode.html

UPDATE: Se stai usando localStorage, suppongo che si ha familiarità con window.localStorage.length, anche se questo dice solo quanto è stato utilizzato, non è se i nuovi dati si adatta. Vorrei anche consigliare vivamente la lettura di Dive Into HTML5 , in particolare la sezione di stoccaggio:

http://diveintohtml5.ep.io/storage.html

A meno che qualcosa è cambiato dalla sua scrittura, io non sono sicuro di quello che si può fare come localStorage si limita a 5 MB per ogni dominio con alcun modo per l'utente di aumentarlo.

Se si sta parlando di utilizzo della memoria, allora no. Non v'è alcun modo di determinare in modo affidabile la memoria utilizzata (almeno attuazione-indipendente), poiché ciò non è parte della specifica ECMAScript. Dipende dal vostro codifica dei caratteri.

Dipende i dati nella stringa e il modo in cui è memorizzato. Se la stringa codificata Base64 viene archiviato come Base64 codificato stringa, la lunghezza è la stessa della dimensione su disco. In caso contrario, si deve decodificarlo

Ho trovato una soluzione (anche se sembra un po 'icky) qui

 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)
 }

È possibile contare il numero di byte in una stringa da questo semplice e preciso modo

var head = 'data:image/png;base64,';
var imgFileSize = Math.round((string.length - head.length)*3/4) ;

console.log("size is ",imgFileSize);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top