Использование Python simplejson для передачи JSON на другой сервер приводит к проблемам с кодировкой Unicode - PullRequest
2 голосов
/ 09 января 2011

Я кодирую строку с библиотекой Python's simplejson со специальными символами:

привет тестирование

spécißl символов

плюсов: +++++

специальные символы: œ∑´® † ¥ ¨ˆøπ “ß∂ƒ © ˙∆˚¬Ω≈ç√∫˜µ≤≥

Однако, когда я кодирую его и передаю на другой компьютер (используя POST), получается так:

{'message': ['{"body": "привет тестирование sp \\ u00e9ci \\ u00dfl символов \\ n \\ nplusses: \\ 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" }]}

Знаки + полностью удалены, а остальные в формате Юникод (?). Мой код для этого:

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

Есть идеи? Спасибо!

Редактировать: я пытался использовать json.dumps(data, ensure_ascii=False), но это приводит к ошибке UnicodeError ordinal not in range.

Ответы [ 2 ]

2 голосов
/ 09 января 2011
>>> import json

простой пример, с плюсами, Latin1 "s sharp", кириллица "capital 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, прежде чем вы сможете его передать, и декодирован на другом конце. Вы все еще должны принять меры предосторожности против искалеченных + < > & и т. Д. Символов.

0 голосов
/ 09 января 2011

ты так делаешь?

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

>>>
...