使用Python simplejson传输JSON到另一服务器导致Unicode编码问题

2 投票
2 回答
2392 浏览
提问于 2025-04-16 09:38

我在用Python的simplejson库编码一个包含特殊字符的字符串:

你好,测试

特殊字符

加号:+++++

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

但是,当我编码后并通过POST发送到另一台机器时,结果变成了这样:

{'message': ['{"body": "你好,测试 sp\\u00e9ci\\u00dfl 字符\\n\\n加号: \\n\\n特殊字符 :\\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 的错误。

2 个回答

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 :œ∑´®†¥¨ˆøπ“ß∂ƒ©˙∆˚¬Ω≈ç√∫˜µ≤≥

>>>
2
>>> import json

这是一个简单的例子,里面有加号、拉丁字母中的“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字符串,然后才能传输,并在另一端解码。你仍然需要注意防止+ < > &等字符被损坏。

撰写回答