我正在编写一个Web应用程序,该应用程序需要通过AJAX将JSON数据存储在固定大小的小型服务器端缓存中(请考虑:Opensocial配额)。我无法控制服务器。
我需要减小存储数据的大小,以保持在服务器端配额之内,并希望能够在将字符串化的JSON发送到服务器之前在浏览器中gzip化该字符串化的JSON。
但是,我找不到Gzip的JavaScript实现方式。关于如何在发送之前在客户端上压缩数据的任何建议?
我正在编写一个Web应用程序,该应用程序需要通过AJAX将JSON数据存储在固定大小的小型服务器端缓存中(请考虑:Opensocial配额)。我无法控制服务器。
我需要减小存储数据的大小,以保持在服务器端配额之内,并希望能够在将字符串化的JSON发送到服务器之前在浏览器中gzip化该字符串化的JSON。
但是,我找不到Gzip的JavaScript实现方式。关于如何在发送之前在客户端上压缩数据的任何建议?
Answers:
编辑在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库中有一种读取压缩数据的方法。
在这里找到了该库:http : //jsxgraph.uni-bayreuth.de/wp/2009/09/29/jsxcompressor-zlib-compressed-javascript-code/ 甚至还有一个独立的实用工具JSXCompressor,并且该代码已获得LGPL许可。
只要在您的项目中包含jsxcompressor.js文件,您就可以读取以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>
我知道这不是您想要的,但我仍然在这里回复,因为我怀疑这会帮助某些人。
<?php..
位吗?我问,因为它已传递给decompress
方法。
14:16:28.512 TypeError: e.replace is not a function[Weitere Informationen] jsxcompressor.min.js:19:12201
我们刚刚发布了pako https://github.com/nodeca/pako(zlib到javascript的端口)。我认为这是deflate / inflate / gzip / ungzip最快的js实现。此外,它还拥有民主的MIT许可证。Pako支持所有zlib选项,其结果是二进制相等的。
例:
var inflate = require('pako/lib/inflate').inflate;
var text = inflate(zipped, {to: 'string'});
var inflate = require('pako/lib/inflate').inflate; var text = inflate(zipped, {to: 'string'});
@Redsandro这是我使用pako的方式。
incorrect header check
我将LZMA的实现从GWT模块移植到了独立的JavaScript中。它称为LZMA-JS。
我猜想就处理时间而言,通用的客户端JavaScript压缩实现将是一个非常昂贵的操作,而不是另外一些带有未压缩有效负载的HTTP数据包的传输时间。
您是否进行了任何测试以使您知道节省多少时间?我的意思是,节省带宽不是您所追求的,不是吗?
您可以使用页面中嵌入的每1像素Java小程序1像素并将其用于压缩。
它不是JavaScript,客户端将需要Java运行时,但是它将满足您的需求。