7

ASCII テーブルを超える文字を含む非常に長い JSON メッセージがあります。次のように文字列に変換します。

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 をインポートする必要をなくす気の利いた 1 つのライナー ステートメントを読みました。

文字列 (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 バイト文字列 (入力など) を解釈する方法を関数に指示します。を使用したため、出力はまったくエンコードされません。messageensure_ascii=False

圧縮前にデータをエンコードします。

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

再度解凍するときは、UTF-8 からデコードする必要はありません。入力がバイト文字列の場合、json.loads()関数は UTF-8 を想定します。

于 2013-08-26T17:36:17.263 に答える