我正在编写一个Web应用程序,需要通过AJAX将JSON数据存储在一个小的、固定大小的服务器端缓存中(想想Opensocial配额)。我对服务器没有控制权。
我需要减少存储数据的大小,以保持在服务器端配额,并希望能够在发送到服务器之前在浏览器中gzip字符串化的JSON。
但是,我找不到太多Gzip的JavaScript实现。关于如何在发送数据之前在客户端压缩数据,有什么建议吗?
我正在编写一个Web应用程序,需要通过AJAX将JSON数据存储在一个小的、固定大小的服务器端缓存中(想想Opensocial配额)。我对服务器没有控制权。
我需要减少存储数据的大小,以保持在服务器端配额,并希望能够在发送到服务器之前在浏览器中gzip字符串化的JSON。
但是,我找不到太多Gzip的JavaScript实现。关于如何在发送数据之前在客户端压缩数据,有什么建议吗?
我想,就处理时间而言,与未压缩有效负载的多个HTTP数据包的传输时间相比,通用的客户端JavaScript压缩实现将是一项非常昂贵的操作。
你是否做过任何测试来让你知道可以节省多少时间?我的意思是,节省带宽不可能是你追求的,不是吗?
编辑在http://pieroxy.net/blog/pages/lz-string/index.html上似乎有一个更好的LZW解决方案可以正确处理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("");
}
我有另一个问题,我不想在gzip编码数据,而是解码gzip数据。 我在浏览器外运行javascript代码,所以我需要使用纯javascript解码它。
这花了我一些时间,但我发现在JSXGraph库中有一种读取gzip数据的方法。
这是我找到图书馆的地方:http://jsxgraph.uni-bayreuth.de/wp/2009/09/29/jsxcompressor-zlib-compressed-javascript-code/ 甚至有一个独立的实用程序可以做到这一点,JSXCompressor,其代码是经过LGPL许可的。
只需要在你的项目中包含jsxcompressor.js文件,然后你将能够读取base64编码的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>
我知道这不是你想要的,但我仍然在这里回复,因为我怀疑它会帮助一些人。
我们刚刚发布了pako https://github.com/nodeca/pako,将zlib移植到javascript。我认为这是现在最快的deflate / inflation / gzip / ungzip的js实现。此外,它拥有民主的MIT许可证。Pako支持所有zlib选项,其结果是二进制相等的。
例子:
var inflate = require('pako/lib/inflate').inflate;
var text = inflate(zipped, {to: 'string'});