Обратите внимание, что вторая итерация возвращает объект Unicode.
Это кажется странным, но документация называет это:
Если ensure_ascii является False, то результат может содержать не-ASCII символы, а возвращаемое значение может быть юникода экземпляр.
Казалось бы, что только "UTF-8" работает с ensure_ascii=False
И если вход является UTF-8 строка в кодировке (не Unicode). С Unicode ввода:
>>> json.dumps({u'Caf€': 1}, ensure_ascii=False, encoding='utf-8')
u'{"Caf\u20ac": 1}'
С ensure_ascii=False
, все другие действительные кодировок возвращают экземпляр Unicode.
Если вы установите ensure_ascii=True
, то кодирование последовательно и работает с другим кодированием, такие как «Windows-1252» (вход должен быть Unicode)
Я думаю, суть заключается в том, что JSON должен быть ASCII и все кодировки должны быть экранированы, даже если это UTF-8.
Чтобы избежать каких-либо сюрпризов следовать этим правилам:
Для правильной спецификации. ASCII JSON: объект
- Pass Unicode
вызовов:
>>> json.dumps({u'Caf€': 1}, ensure_ascii=True)
'{"Caf\\u20ac": 1}'
UTF-8 кодировкой JSON: объект
- Pass Unicode
Вызов:
>>> json.dumps({u'Caf€': 1}, ensure_ascii=False).encode("utf-8")
'{"Caf\xe2\x82\xac": 1}'