javascript - 用 pako(javascript 中的 zlib)压缩,用 zlib(python)解压不起作用

标签 javascript python unicode utf-8 zlib

使用 pako( https://github.com/nodeca/pako ) Pako 在 javascript 中执行压缩的代码.它压缩字符串 't'

var compressedString = pako.gzip('t', {level: 4, to: 'string'}));
$.ajax('/decompress', {string: compressedString})

执行解压缩的/decompress 处的代码

from cgi import parse_qs, escape
import json
import zlib
def application(environ, start_response):
    status = '200 OK'
    try:
        request_body_size = int(environ.get('CONTENT_LENGTH', 0))
    except (ValueError):
        request_body_size = 0
    request_body = environ['wsgi.input'].read(request_body_size)
    d = parse_qs(request_body)

    response_headers = [('Content-type', 'text/plain')]
    start_response(status, response_headers)
    inputString = d.get('string')[0]
    # Use same wbits(=31) as used by pako
    decompressed = zlib.decompress(inputString, 31);
    return 'done'

进行解压会抛出以下错误。错误发生在 zlib.decompress 行。

error: Error -3 while decompressing data: incorrect header check

我还尝试编码 inputString(

inputString.encode('utf-8')

) 但它也会抛出错误。

最佳答案

to: 'string'

此选项通过将每个字节映射到具有相同编号的字符,将输出字节序列走私到 JS (Unicode) String。 (这相当于使用 ISO-8859-1 编码进行解码。)

$.ajax('/decompress', {string: compressedString})

XMLHttpRequest 需要将 (Unicode) 字符串值编码回字节序列以通过网络传输(URL 编码)。它使用的编码是 UTF-8,而不是 ISO-8859-1,因此网络上的字节序列与 GZip 压缩器输出的字节序列不同。

您可以在 Python 端通过在 URL 解码步骤后重新编码来撤消此过程:

d = parse_qs(request_body).decode('utf-8').encode('iso-8859-1')

现在您应该拥有与压缩器相同的字节序列。

将字节作为 UTF-8 编码的代码点发送,并对其中的非 ASCII 字节进行 URL 编码,这将使网络流量膨胀到原始字节占用量的四倍左右,这反而会破坏良好的压缩效果。

如果您只是将数据字符串作为请求主体单独发布到 Python 脚本,您可能会丢失 URL 编码,然后您的请求将仅(!)比原始压缩数据多大约 50%。要做得更好,您需要开始考虑直接发送原始字节 as a ByteArray ,或者可能使用多部分 form-data .无论哪种方式都存在浏览器兼容性问题。

关于javascript - 用 pako(javascript 中的 zlib)压缩,用 zlib(python)解压不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40980402/

相关文章:

javascript - 为动态对象添加类名

python - 附加一个 numpy 数组,但以二维方式组织附加信息

越南语的 Unicode 范围

c# - 仅接受波斯字符的正则表达式

javascript - 如何检查 svg <g> 元素是否支持 css 转换

javascript - 如何通过 jquery ajax 发送不同的行 id,通过单击复选框来更新另一个 php 页面中的表记录?

javascript - 有没有办法在串联文件之间添加回车符?

python - 错误时正确退出 while 循环

python - 如何使用静态方法初始化静态变量?

java - Mysql数据库编码问题