Python中UTF-8兼容的压缩方法

4 投票
1 回答
2175 浏览
提问于 2025-04-16 05:27

我想在一个json数据包里放一个很大的压缩字符串,但遇到了一些困难。

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

这会导致一个

UnicodeDecodeError: 'utf8' codec can't decode bytes in position 10-13: invalid data

一个明显的解决办法是把整个json结构用bz2压缩,但假设我在用一个黑箱API,它负责json编码,并且需要一个字典。

另外,我只是用bz2作为例子,其实我并不在乎具体用什么压缩算法,不过我注意到zlib也有类似的表现。

我能理解这两个压缩库为什么不能生成utf-8兼容的输出,但有没有什么办法可以有效压缩utf-8字符串呢?这个页面看起来很有用 http://unicode.org/faq/compression.html,但我找不到相关的python信息。

1 个回答

11

你是说“压缩成UTF-8字符串”吗?我假设你是这个意思,因为任何通用的压缩工具都能压缩UTF-8字符串。不过,实际上没有哪个压缩工具会直接压缩成UTF-8字符串。

你不能直接把像UTF-8这样的8位数据存储在JSON里,因为JSON字符串是按照Unicode来定义的。在把数据放进JSON之前,你需要先把它进行base64编码:

json.dumps({ 'compressedData' : base64.b64encode(zString) })

不过,base64编码本身会导致一个4/3的编码开销。如果你在压缩普通的字符串数据,通常还是能压缩得足够多,这样做还是有好处的,但这个开销是相当大的。你可能会找到一些开销稍微小一点的编码方式,但不会差太多。

需要注意的是,如果你是用这个方法把数据发送到浏览器,最好还是让HTTP压缩来处理这个问题;这种方式支持广泛,而且会更可靠。

撰写回答