我想在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
一个明显的解决方案是bz2'整个json结构,但我们假设我正在使用一个执行json编码的blackbox api,它想要一个字典。
另外,我只是以bz2为例,虽然我注意到与zlib的行为相同,但我并不在乎实际算法是什么。
我可以理解为什么这两个压缩库不能创建utf-8兼容输出,但有没有任何解决方案可以有效地压缩utf-8字符串?这个页面好像是一个金矿http://unicode.org/faq/compression.html,但我找不到任何相关的python信息。
答案 0 :(得分:11)
你的意思是“压缩到 UTF-8字符串”?我会假设,因为任何通用压缩器都会压缩UTF-8字符串。但是,没有真实的压缩器会将压缩为 UTF-8字符串。
您无法直接在JSON中存储UTF-8等8位数据,因为JSON字符串定义为Unicode。在将数据提供给JSON之前,您必须对数据进行base64编码:
json.dumps({ 'compressedData' : base64.b64encode(zString) })
但是,base64固有地导致4/3编码开销。如果你正在压缩典型的字符串数据,你可能会得到足够的压缩,但这仍然是一个胜利,但这是一个巨大的开销。您可能会发现编码的开销略低,但不多。
请注意,如果您使用此功能将数据发送到浏览器,那么最好让HTTP压缩执行此操作;它得到了广泛的支持,并且将更加强大。