Warum unterscheidet sich sys.getdefaultencoding () von sys.stdout.encoding und wie werden Unicode-Zeichenfolgen unterbrochen?

Ich habe ein paar zornige Stunden damit verbracht, nach dem Problem mit Unicode-Zeichenfolgen zu suchen, das in etwas zerlegt wurde, das Python (2.7) vor mir verbirgt, und das ich immer noch nicht verstehe. Zuerst habe ich versucht, zu verwendenu".." Zeichenfolgen konsequent in meinem Code, aber das führte zu dem berüchtigtenUnicodeEncodeError. Ich habe versucht mit.encode('utf8'), aber das hat auch nicht geholfen. Schließlich stellte sich heraus, dass ich auch nicht verwenden sollte und alles funktioniert automatisch. Allerdings habe ich (hier muss ich einem Freund, der mir geholfen hat, meine Ehre aussprechen) etwas Seltsames bemerkt, als ich meinen Kopf gegen die Wand schlug.sys.getdefaultencoding() kehrt zurückASCIIwährendsys.stdout.encoding kehrt zurückUTF-8. 1. im Code unten funktioniert gut ohne Änderungen ansys und 2. wirft aUnicodeEncodeError. Wenn ich die Standard-Systemkodierung mit änderereload(sys).setdefaultencoding("utf8"), dann 2. funktioniert gut. Meine Frage ist, warum sich die beiden Codierungsvariablen in erster Linie unterscheiden und wie ich es schaffe, in diesem einfachen Codeteil die falsche Codierung zu verwenden. Bitte, schick mich nicht zumUnicode-HOWTOIch habe das offensichtlich in den zig Fragen über gelesenUnicodeEncodeError.

#  -*- coding: utf-8 -*-
import sys


class Token:
    def __init__(self, string, final=False):
        self.value = string
        self.final = final

    def __str__(self):
        return self.value

    def __repr__(self):
        return self.value

print(sys.getdefaultencoding())
print(sys.stdout.encoding)

# 1.
myString = "I need 20 000€."
tok = Token(myString)
print(tok)

reload(sys).setdefaultencoding("utf8")

# 2.
myString = u"I need 20 000€."
tok = Token(myString)
print(tok)

Antworten auf die Frage(2)

Ihre Antwort auf die Frage