使用zlib压缩和解压缩UTF-8数据的正确方法是什么?

I Z*_*I Z 7 python compression json utf-8 python-2.x

我有一个非常长的JSON消息,其中包含超出ASCII表的字符.我把它转换成一个字符串如下:

messStr = json.dumps(message,encoding='utf-8', ensure_ascii=False, sort_keys=True)
Run Code Online (Sandbox Code Playgroud)

我需要使用将其大小限制为X字节的服务来存储此字符串.我想将JSON字符串拆分为长度为X的片段并分别存储它们.我遇到了一些问题(这里描述)所以我想压缩字符串切片来解决这些问题.我试着这样做:

ss = mStr[start:fin]    # get piece of length X
ssc = zlib.compress(ss) # compress it
Run Code Online (Sandbox Code Playgroud)

当我这样做时,我收到以下错误zlib.compress:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xf1' in position 225: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)

压缩UTF-8字符串的正确方法是什么,然后解压缩它的正确方法是什么?

Lyn*_*Lab 12

Martijn回应的一点点补充.我在Enthought博客中读到一个漂亮的衬垫语句,它将使您无需在自己的代码中导入zlib.

安全地压缩字符串(包括你的json转储)看起来像这样:

ssc = ss.encode('utf-8').encode('zlib_codec')
Run Code Online (Sandbox Code Playgroud)

解压缩回utf-8将是:

ss = ssc.decode('zlib_codec').decode('utf-8')
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.


Mar*_*ers 5

您的JSON数据不是 UTF-8编码的.函数的encoding参数json.dumps()指示它如何解释message(例如输入)中的Python字节串,而不是如何对结果输出进行编码.它不输出编码可言,因为你使用ensure_ascii=False.

压缩前对数据进行编码:

ssc = zlib.compress(ss.encode('utf8'))
Run Code Online (Sandbox Code Playgroud)

再次解压缩时,无需从UTF-8解码; json.loads()如果输入是字节串,则该函数假定为UTF-8.