我想在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,但让我们假设我使用的是一个执行json编码的黑盒api,它需要一个dict。
另外,我只是以bz2为例,我并不真正关心实际的算法是什么,尽管我注意到zlib也有同样的行为。
我可以理解为什么这两个压缩库不能创建与utf-8兼容的输出,但是有什么解决方案可以有效地压缩utf-8字符串吗?这个页面看起来像一个金矿http://unicode.org/faq/compression.html,但我找不到任何相关的python信息。
发布于 2010-10-14 09:19: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压缩来做这件事;它得到了广泛的支持,而且更加健壮。
https://stackoverflow.com/questions/3929301
复制相似问题