Pregunta

Tengo que tratar de estimar el DISCO tamaño de una cadena de texto (que puede ser texto sin formato o una base 64 codificado de cadena para una imagen / audio / etc) en JavaScript. No estoy seguro de cómo calcular esto. La única cosa que puedo encontrar buscando en Google es .length así que pensé que tal vez alguien podría saber en StackOverflow ...

La razón por la que hay que saber es que tengo un script localStorage que las necesidades (o les gustaría tener) la capacidad de comprobar cuando un usuario se acerca a su 5 MB (o 10 MB en IE) de cuotas y rápido que les permite aumentar el tamaño máximo para el dominio. Por lo tanto, si un usuario golpea, digamos, 4.5MBs de datos que sería rápido con

  

Usted está a punto de su gorra de los navegadores de datos de 5 MB. Por favor incrementar sus datos máximo por ... [instrucciones sobre aumentarla para el navegador]

¿Fue útil?

Solución

No va a ser exactos, pero se puede contar el número de bytes en una cadena para obtener una estimación aproximada.

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

Otros consejos

Se va a depender de su codificación de caracteres. Si utiliza la codificación ASCII, que va a ser bytes str.length. Si utiliza UTF-16, que va a ser (str.length * 2) bytes. Si utiliza UTF-8, que va a depender de los caracteres de la cadena. (Algunos personajes tomarán solamente 1 byte, pero otros pueden tardar hasta 4 bytes). Si usted está tratando con datos codificados en base 64, los personajes están todos dentro del rango ASCII y por lo tanto ocuparían str.length bytes en el disco. Si les decodificar primero y guardar como binarios, se necesitarían (str.length * 3/4) bytes. (Con Base64, 3 bytes no codificados se convierten en 4 bytes codificados.)

BTW - (! Sin excusas) Si usted no ha leído Joel Spolsky de El desarrollador absoluto mínimo Cada software absolutamente, positivamente debe saber acerca de Unicode y juegos de caracteres , debe hacerlo inmediatamente

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

ACTUALIZACIÓN: Si está utilizando localStorage, supongo que usted está familiarizado con window.localStorage.length, aunque esto sólo indica cuánto se ha utilizado, no es si sus nuevos datos caben. También recomendaría encarecidamente leer Inmersión en HTML5 , en especial el apartado de almacenamiento:

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

A menos que algo ha cambiado desde su escritura, no estoy seguro de lo que puede hacer como localStorage se limita a 5 MB por dominio y no hay forma de que el usuario aumente a él.

Si usted está hablando de uso de la memoria, entonces no. No hay manera de determinar con fiabilidad la memoria usada (al menos implementación independiente), ya que esto no es parte de la especificación ECMAScript. Depende de su codificación de caracteres.

Depende de los datos de la cadena y la forma en que se almacena. Si su cadena codificada en Base64 se almacena como una cadena codificada en Base64, la longitud es el mismo que el tamaño del disco. Si no es así, hay que decodificar

He encontrado una solución (aunque parece un poco repulsivo) aquí

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

Se puede contar el número de bytes en una cadena mediante esta sencilla y de manera precisa

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

console.log("size is ",imgFileSize);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top