2015-11-16 3 views

ответ

1

Обратите внимание, что вторая итерация возвращает объект 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: объект

  1. Pass Unicode
  2. вызовов:

    >>> json.dumps({u'Caf€': 1}, ensure_ascii=True) 
    '{"Caf\\u20ac": 1}' 
    

UTF-8 кодировкой JSON: объект

  1. Pass Unicode
  2. Вызов:

    >>> json.dumps({u'Caf€': 1}, ensure_ascii=False).encode("utf-8") 
    '{"Caf\xe2\x82\xac": 1}'