我无法在这里得到答案,所以我做了一些研究。
正如这里PleaseStand
所指出的,问题在于 PHP 使用 UTF-8 字符串,而 JS 使用 UTF-16 字符串。因此,二进制字符串到 base64 字符串编码会有所不同。
我使用的解决方案是强制 JS 将数据解释为 UTF-8。这很简单,因为pako
接受并返回Uint8Array
s,它们本质上是 UTF-8 字符串。:
在 JS 中压缩,在 PHP 中解压缩:
//JS
const pako = require('pako');
const compress = str => Buffer.from(pako.deflateRaw(str)).toString('base64');
console.log(compress('asdfasdfasdfasdf')); //SyxOSUtEwgA=
//PHP
function decompress($str) { return gzinflate(base64_decode($str)); }
echo decompress('SyxOSUtEwgA='); //asdfasdfasdfasdf
用 PHP 压缩,用 JS 解压:
//PHP
function compress($str) { return base64_encode(gzdeflate($str, 9)); }
echo compress('asdfasdfasdf'); //SyxOSUuEYgA=
//JS
const pako = require('pako');
const decompress = str => pako.inflateRaw(Buffer.from(str, 'base64'), {to: 'string'});
console.log(decompress('SyxOSUuEYgA=')); //asdfasdfasdfs
注意:Buffer
实例也是Uint8Array
实例,因此我们不需要在将其提供给 pako 之前将其转换Buffer
为 a 。Uint8Array
这些功能在语言中也兼容:
//JS
console.log(decompress(compress('asdfasdfasdfasdf'))); //asdfasdfasdfasdf
//PHP
echo decompress(compress('asdfasdfasdfasdf')); //asdfasdfasdfasdf
对于 JS,这在 NodeJs 中是开箱即用的。在浏览器环境中,您将需要一个用于Buffer
.
对于 PHP,请记住安装Zlib
扩展。