python中的UTF-8兼容压缩

Ral*_*eon 4 python utf-8

我想在json数据包中包含一个大的压缩字符串,但是有一些困难.

import json,bz2
myString = "A very large string"  
zString = bz2.compress(myString)
json.dumps({ 'compressedData' : zString })
Run Code Online (Sandbox Code Playgroud)

这会导致一个

UnicodeDecodeError: 'utf8' codec can't decode bytes in position 10-13: invalid data
Run Code Online (Sandbox Code Playgroud)

一个明显的解决方案是bz2'整个json结构,但我们假设我正在使用一个执行json编码的blackbox api并且它想要一个dict.

另外,我只是以bz2为例,虽然我注意到与zlib相同的行为,但我并不在乎实际算法是什么.

我可以理解为什么这两个压缩库不会创建utf-8兼容输出,但有没有任何解决方案可以有效地压缩utf-8字符串?这个页面好像是一个金矿http://unicode.org/faq/compression.html但我找不到任何相关的python信息.

Gle*_*ard 11

你的意思是"压缩 UTF-8字符串"?我会假设,因为任何通用压缩器都会压缩UTF-8字符串.但是,没有真实的压缩器会压缩 UTF-8字符串.

您不能直接在JSON中存储UTF-8等8位数据,因为JSON字符串定义为Unicode.在将数据提供给JSON之前,您必须对数据进行base64编码:

json.dumps({ 'compressedData' : base64.b64encode(zString) })
Run Code Online (Sandbox Code Playgroud)

但是,base64固有地导致4/3编码开销.如果你正在压缩典型的字符串数据,你可能会得到足够的压缩,但这仍然是一个胜利,但这是一个巨大的开销.您可能会发现编码的开销略低,但并不多.

请注意,如果您使用此功能将数据发送到浏览器,那么最好让HTTP压缩执行此操作; 它受到广泛支持,并且将更加强大.