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

2024-04-26 07:26:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一条很长的JSON消息,其中包含超出ASCII表的字符。我将其转换为字符串,如下所示:

messStr = json.dumps(message,encoding='utf-8', ensure_ascii=False, sort_keys=True)

我需要使用将其大小限制为X字节的服务来存储此字符串。我想将JSON字符串分割成X长度的片段,并分别存储它们。我在执行此操作时遇到了一些问题(描述了here),因此我想压缩字符串片段来解决这些问题。我试着这么做:

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

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

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

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


Tags: 方法字符串injson消息messageascii字符
2条回答

您的JSON数据未编码。函数的encoding参数指示它如何解释message(例如,输入)中的Python字节字符串,而不是如何对生成的输出进行编码。它根本不会对输出进行编码,因为您使用了ensure_ascii=False

压缩前对数据进行编码:

ssc = zlib.compress(ss.encode('utf8'))

当再次解压缩时,不需要从UTF-8解码;如果输入是bytestring,json.loads()函数将采用UTF-8。

对马蒂金的反应有点补充。 我读到了一个漂亮的单行语句,它将使您无需在自己的代码中导入zlib。

安全地压缩字符串(包括json转储)如下所示:

ssc = ss.encode('utf-8').encode('zlib_codec')

减压回utf-8将是:

ss = ssc.decode('zlib_codec').decode('utf-8')

希望这有帮助。

相关问题 更多 >