代码之家  ›  专栏  ›  技术社区  ›  Ralphleon

python中的utf-8兼容压缩

  •  4
  • Ralphleon  · 技术社区  · 16 年前

    我想在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结构,但是假设我使用的是一个blackbox API,它执行JSON编码,它需要一个dict。

    另外,我只是以BZ2为例,我并不真正关心实际的算法是什么,尽管我注意到了与Zlib相同的行为。

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

    1 回复  |  直到 16 年前
        1
  •  11
  •   Glenn Maynard    16 年前

    你是说“压缩” 到 UTF-8字符串“?我假设,因为任何通用的压缩器都会压缩UTF-8字符串。然而,现实世界中没有一台压缩机会压缩 到 一个UTF-8字符串。

    不能在JSON中直接存储像UTF-8这样的8位数据,因为JSON字符串被定义为Unicode。在将数据交给JSON之前,必须对其进行base64编码:

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

    但是,base64本身会导致4/3的编码开销。如果您压缩的是典型的字符串数据,那么您可能会获得足够的压缩,这样仍然是一个胜利,但这是一个很大的开销。您可能会发现一个开销稍微少一点的编码,但不会太多。

    请注意,如果您使用它向浏览器发送数据,最好让HTTP压缩完成这一任务;它得到了广泛的支持,并且将更加健壮。

    推荐文章