Warum python json.dumps klagt über ascii decoding?

Ich habe die folgenden Zeilen in meinem Code

outs = codecs.getwriter('utf-8')(sys.stdout) # dJSON contains JSON message with non-ASCII chars outs.write(json.dumps(dJSON,encoding='utf-8', ensure_ascii=False, indent=indent_val)) 

Ich bekomme die folgende Ausnahme:

  • Video kann nicht mit opencv geöffnet werden
  • Wieder: UnicodeEncodeError: ascii codec kann nicht codieren
  • Drucken auf UTF-8 codierte Datei mit plattformabhängigen Zeilenumbrüchen?
  • Öffnen Sie DivX / XVID Videos in OpenCV Python
  • Open () und codecs.open () in Python 2.7 verhalten sich seltsam anders
  • Spezielle nationale Zeichen werden in Python nicht .plit ()
  •   outs.write(json.dumps(dJSON,encoding='utf-8', ensure_ascii=False, indent=indent_val)) File "/usr/lib/python2.7/json/__init__.py", line 238, in dumps **kw).encode(obj) File "/usr/lib/python2.7/json/encoder.py", line 204, in encode return ''.join(chunks) UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 27: ordinal not in range(128) 

    Ich durch das durch die Angabe von encoding='utf-8' in der json.dumps Anweisung, ich vermeide diese Art von Problem. Warum bekomme ich immer noch den Fehler?

  • Python argparse erforderlich = True but --version Funktionalität?
  • Parser in python3 nimmt keine Trennzeichen von Kommandozeile über argparse
  • Übergeben von Befehlszeilenargumenten an argv in jupyter / ipython notebook
  • Python-Befehlszeilenparameter
  • Wie kann ich Befehlszeilenargumente in Python verarbeiten?
  • Python: Wie kann man in optparse eine Option machen?
  • 2 Solutions collect form web for “Warum python json.dumps klagt über ascii decoding?”

    Meine Vermutung ist, dass das dJSON Objekt keinen reinen Unicode enthält, sondern es enthält eine Mischung aus Unicode und Strings, die bereits als utf-8 codiert sind

     >>> d = {u'name':u'पाइथन'.encode('utf-8')} >>> json.dumps(d, encoding='utf-8', ensure_ascii=False) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 238, in dumps **kw).encode(obj) File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 204, in encode return ''.join(chunks) UnicodeDecodeError: 'ascii' codec can't decode byte 0xe0 in position 1: ordinal not in range(128) 

    Aber das funktioniert (alles Unicode)

     >>> d = {u'name':u'पाइथन'} >>> json.dumps(d, encoding='utf-8', ensure_ascii=False) u'{"name": "\u092a\u093e\u0907\u0925\u0928"} 

    Obwohl das auch funktioniert (alles String)

     >>> d = {'name':u'पाइथन'.encode('utf-8')} >>> json.dumps(d, encoding='utf-8', ensure_ascii=False) '{"name": "\xe0\xa4\xaa\xe0\xa4\xbe\xe0\xa4\x87\xe0\xa4\xa5\xe0\xa4\xa8"}' 

    Es gibt einen Workaround: Übergeben Sie die utf8 Codierung (nicht utf-8 !) Auf Dumps-Methode. In diesem Fall wird es zwingen, alle Strings zu decodieren, um unicode zuerst, und Sie können eine Mischung aus Unicode-Strings und Strings bereits als UTF-8 codiert verwenden. Warum funktioniert das? Denn es gibt so etwas im Quellcode von JSONEncoder :

     if self.encoding != 'utf-8': def _encoder(o, _orig_encoder=_encoder, _encoding=self.encoding): if isinstance(o, str): o = o.decode(_encoding) return _orig_encoder(o) 

    Das ist, was wir brauchen, und es wird nicht aus der Box gehen. Aber wenn wir die Codierung auf utf8 ändern (das ist absolut das gleiche UTF-8 wie utf-8 ), zwingen wir diesen _encoder zu definieren und alles funktioniert ganz gut 🙂

    Python ist die beste Programmiersprache der Welt.