2

私は特殊文字を含むPythonのsimplejsonライブラリで文字列をエンコードしています:

こんにちはテスト

特殊文字

プラス: +++++

特殊文字 :œ∑´®†\¨ˆøπ“ß∂ƒ©˙∆˚¬Ω≈ç√∫˜μ≤≥

しかし、それをエンコードして (POST を使用して) 他のマシンに送信すると、次のようになります。

{'message': ['{"body": "hello testing sp\\u00e9ci\\u00dfl characters\\n\\nplusses: \\n\\nspecial chars:\\u0153\\u2211\\u00b4\\u00ae \\u2020\\u00a5\\u00a8\\u02c6\\u00f8\\u03c0\\u201c\\u00df\\u2202\\u0192\\u00a9\\u02d9\\u2206\\u02da\\u00ac\\u03a9\\ u2248\\u00e7\\u221a\\u222b\\u02dc\\u00b5\\u2264\\u2265"}']}

+ 記号は完全に取り除かれ、残りはこの unicode(?) 形式になっています。これに対する私のコードは次のとおりです。

data = {'body': data_string}
data_encoded = json.dumps(data)

何か案は?ありがとう!

編集:使用してみましjson.dumps(data, ensure_ascii=False)たが、UnicodeError ordinal not in rangeエラーになります。

4

2 に答える 2

2
>>> import json

プラス記号付きの簡単な例、Latin1 "s Sharp"、キリル文字の "capital zhe"

注: 文字列が Unicode または ASCII であることを確認してください。

>>> data = {"body" : u"++\xdf\u0416", "universe": 42}
>>> data
{'body': u'++\xdf\u0416', 'universe': 42}

ASCII であることが判明した JSON 文字列を作成します。非 ASCII 文字はすべてエスケープされます。

>>> encoded = json.dumps(data)
>>> encoded
'{"body": "++\\u00df\\u0416", "universe": 42}'

JSON 文字列を別のコンピューターに送信します。伝送チャネルが ASCII 文字を破壊する場合は、必要に応じてさらにエスケープを行ってください。リモート コンピューターで、JSON 文字列を回復するために必要なエスケープを解除します。

次に、JSON 文字列を Python オブジェクトに変換します。

>>> decoded = json.loads(encoded)
>>> decoded
{u'body': u'++\xdf\u0416', u'universe': 42}
>>> decoded == data
True
>>>

に関する注意: これにより、次の文字列ensure_ascii=Falseが生成されます。unicode

>>> u_encoded = json.dumps(data, ensure_ascii=False)
>>> u_encoded
u'{"body": "++\xdf\u0416", "universe": 42}'

これは、送信する前に文字列にエンコード (UTF-8推奨) し、相手側でデコードする必要があります。str壊れた文字などに対する予防措置を講じる必要があります+ < > &

于 2011-01-08T23:50:17.273 に答える
0

そんなことしてるの?

>>> s = u"""
... hello testing
... 
... spécißl characters
... 
... plusses: +++++
... 
... special chars :œ∑´®†¥¨ˆøπ“ß∂ƒ©˙∆˚¬Ω≈ç√∫˜µ≤≥
... """
>>> from json import dumps, loads
>>> loads(dumps(s))
u'\nhello testing\n\nsp\xe9ci\xdfl characters\n\nplusses: +++++\n\nspecial chars :\u0153\u2211\xb4\xae\u2020\xa5\xa8\u02c6\xf8\u03c0\u201c\xdf\u2202\u0192\xa9\u02d9\u2206\u02da\xac\u03a9\u2248\xe7\u221a\u222b\u02dc\xb5\u2264\u2265\n'
>>> print loads(dumps(s))

hello testing

spécißl characters

plusses: +++++

special chars :œ∑´®†¥¨ˆøπ“ß∂ƒ©˙∆˚¬Ω≈ç√∫˜µ≤≥

>>>
于 2011-01-08T23:12:35.437 に答える