Gzip 的 JavaScript 实现 [已关闭]

2022-08-30 01:10:02

我正在编写一个Web应用程序,该应用程序需要通过AJAX将JSON数据存储在小型固定大小的服务器端缓存中(想想:Opensocial quotas)。我无法控制服务器。

我需要减小存储数据的大小以保持在服务器端配额内,并希望能够在将字符串化JSON发送到服务器之前在浏览器中对其进行gzip。

但是,我在Gzip的JavaScript实现中找不到太多东西。对于如何在发送数据之前压缩客户端上的数据,有什么建议吗?


答案 1

编辑似乎有一个更好的LZW解决方案,可以在 http://pieroxy.net/blog/pages/lz-string/index.html 正确处理Unicode字符串(感谢注释中的pieroxy)。


我不知道有任何gzip实现,但是jsolait库(该网站似乎已经消失了)具有LZW压缩/解压缩的功能。该代码包含在 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("");
}

答案 2

我遇到了另一个问题,我不想用gzip编码数据,而是解码gzip数据。我在浏览器之外运行javascript代码,所以我需要使用javascript对其进行解码。

我花了一些时间,但我发现在JSXGraph库中有一种方法可以读取gzip压缩的数据。

这是我找到库的地方:http://jsxgraph.uni-bayreuth.de/wp/2009/09/29/jsxcompressor-zlib-compressed-javascript-code/ 甚至有一个独立的实用程序可以做到这一点,JSXCompressor,代码是LGPL许可的。

只需在项目中包含 jsx 压缩程序.js文件,您就可以读取 base 64 编码的 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>

我知道这不是你想要的,但我仍然在这里回复,因为我怀疑它会帮助一些人。