我正在使用带有特殊字符的Python的simplejson库对字符串进行编码:
你好测试
spécißl字符
plusses:+++++
特殊字符:œΣ'®†¥¨øπ“ß∂ƒ©˙Δ˚¬Ω≈ç√∫〜μ≤≥
然而,当我对它进行编码并将其传输到另一台机器(使用POST)时,结果如下:
{'message':['{“body”:“你好测试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
错误。
答案 0 :(得分:2)
>>> import json
简单的例子,有加号,拉丁语1“s sharp”,西里尔语“资本zhe”
注意:确保您的字符串是unicode或ASCII:
>>> data = {"body" : u"++\xdf\u0416", "universe": 42}
>>> data
{'body': u'++\xdf\u0416', 'universe': 42}
创建您的JSON字符串,结果是ASCII - 所有非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
字符串,然后才能传输,然后在另一端解码。您仍然需要采取预防措施来防止损坏的+ < > &
等字符。
答案 1 :(得分: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 :œ∑´®†¥¨ˆøπ“ß∂ƒ©˙∆˚¬Ω≈ç√∫˜µ≤≥
>>>