7

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

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

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

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 字符串的正确方法是什么,然后解压缩它的正确方法是什么?

4

2 回答 2

14

对 Martijn 的回应有一点补充。我在 Enthought 博客中读到了一个漂亮的衬里语句,它可以让您无需在自己的代码中导入 zlib。

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

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

解压缩回 utf-8 将是:

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

希望这可以帮助。

于 2014-11-22T12:26:56.117 回答
7

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

压缩前对数据进行编码:

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

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

于 2013-08-26T17:36:17.263 回答