163 votos

Implementación de JavaScript de Gzip

Estoy escribiendo una aplicación Web que necesita para almacenar datos JSON en una pequeña, de tamaño fijo en el lado del servidor de caché a través de AJAX (piensa: Opensocial cuotas). No tengo control sobre el servidor.

Tengo que reducir el tamaño de los datos almacenados, para permanecer dentro de un server-side de cuota, y fue con la esperanza de ser capaz de gzip el string JSON en el navegador antes de enviarlo al servidor.

Sin embargo, no puedo encontrar mucho en el camino de las implementaciones de JavaScript de Gzip. Alguna sugerencia de como puedo comprimir los datos en el lado del cliente antes de enviar?

117voto

Matthew Crumley Puntos 47284

Editar parece ser una mejor compresión LZW solución que se encarga de cadenas Unicode correctamente en http://pieroxy.net/blog/pages/lz-string/index.html (Gracias a pieroxy en los comentarios).


No sé de ningún gzip implementaciones, pero la jsolait de la biblioteca (el sitio parece haber desaparecido) tiene funciones para LZW de compresión/descompresión. El código está cubierto bajo la LGPL.

// LZW-compress a string
function lzw_encode(s) {
    var dict = {};
    var data = (s + "").split("");
    var out = [];
    var currChar;
    var phrase = data[0];
    var code = 256;
    for (var i=1; i<data.length; i++) {
        currChar=data[i];
        if (dict[phrase + currChar] != null) {
            phrase += currChar;
        }
        else {
            out.push(phrase.length > 1 ? dict[phrase] : phrase.charCodeAt(0));
            dict[phrase + currChar] = code;
            code++;
            phrase=currChar;
        }
    }
    out.push(phrase.length > 1 ? dict[phrase] : phrase.charCodeAt(0));
    for (var i=0; i<out.length; i++) {
        out[i] = String.fromCharCode(out[i]);
    }
    return out.join("");
}

// Decompress an LZW-encoded string
function lzw_decode(s) {
    var dict = {};
    var data = (s + "").split("");
    var currChar = data[0];
    var oldPhrase = currChar;
    var out = [currChar];
    var code = 256;
    var phrase;
    for (var i=1; i<data.length; i++) {
        var currCode = data[i].charCodeAt(0);
        if (currCode < 256) {
            phrase = data[i];
        }
        else {
           phrase = dict[currCode] ? dict[currCode] : (oldPhrase + currChar);
        }
        out.push(phrase);
        currChar = phrase.charAt(0);
        dict[code] = oldPhrase + currChar;
        code++;
        oldPhrase = phrase;
    }
    return out.join("");
}

43voto

pcans Puntos 3554

Yo tenía otro problema, yo no quiero codificar datos en gzip, pero para decodificar datos gzip. Estoy ejecutando código javascript fuera del navegador, así que hay que decodificar el uso puro javascript.

Me tomó algún tiempo, pero me encontré con que en la JSXGraph de la biblioteca hay una manera de leer datos gzip.

Aquí es donde encontré la biblioteca: http://jsxgraph.uni-bayreuth.de/wp/2009/09/29/jsxcompressor-zlib-compressed-javascript-code/ Hay incluso una utilidad independiente que puede hacer que, JSXCompressor, y el código es LGPL licencied.

Sólo tienes que incluir el jsxcompressor.js archivo en su proyecto y, a continuación, usted será capaz de leer un codificada en base 64 datos gzip:

<!doctype html>
</head>
<title>Test gzip decompression page</title>
<script src="jsxcompressor.js"></script>
</head>
<body>
<script>
    document.write(JXG.decompress('<?php 
        echo base64_encode(gzencode("Try not. Do, or do not. There is no try.")); 
    ?>'));
</script>
</html>

Entiendo que no es lo que quería, pero aún puedo responder aquí porque sospecho que va a ayudar a algunas personas.

17voto

nmrugg Puntos 311

Porté una implementación de LZMA desde un módulo de GWT en standalone JavaScript. Se llama LZMA-JS .

14voto

Mauricio Scheffer Puntos 70470

Éstos son algunos otros algoritmos de compresión implementados en Javascript:

8voto

Sirber Puntos 1025

No he probado, pero hay una aplicación javascript de postal:

http://jszip.stuartk.co.uk/

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X