17

Ich bemerkte, folgendes gilt:Wird eine Unicode-Zeichenfolge, die nur ASCII-Zeichen enthält, immer gleich der ASCII-Zeichenfolge sein?

>>> u'abc' == 'abc' 
True 
>>> 'abc' == u'abc' 
True 

Wird dies immer der Fall sein oder könnte es möglicherweise auf dem Systemgebietsschema ab? (Es scheint, Strings sind Unicode in Python 3: z this question, aber Bytes in 2.x)

+0

Die Zeichen im ASCII-Satz sind Codepage Agnostisch. Es sind nur die erweiterten Zeichen (0x80 bis 0xff), die zwischen den Gebietsschemata abweichen können. – Phylogenesis

+5

@Phylogenesis: Es gibt viele Codierungen, die * nicht * ASCII als Basis verwenden. –

Antwort

13

Python 2 nötigt zwischen unicode und str den ASCII-Codec verwenden, wenn die beiden Arten zu vergleichen. Also ja, das ist immer wahr.

Das heißt, es sei denn, Sie versauen Ihre Python-Installation und verwenden sys.setdefaultencoding(), um diesen Standard zu ändern. Sie können das normalerweise nicht tun, weil die sys.setdefaultencoding() Funktion ist gelöscht aus dem Modul beim Start-up-Zeit, aber es ist ein Cargo Cult umhergehen, wo Menschen reload(sys) verwenden, um diese Funktion wiederherzustellen und die Standard-Codierung zu etwas anderem zu versuchen und zu ändern behebt implizite Codierungs- und Decodierungsprobleme. Das ist aus genau diesem Grund eine dumme Sache.

+1

Was ist genau falsch mit 'sys.setdefaultencoding()'? –

+1

@techtonik: Wenn der Systemstandard geändert wird, können Pakete, die sich auf den Standardwert verlassen, als ASCII deklariert werden, und nur die * masks * geändert werden, wenn der Code auf impliziter Codierung und Decodierung beruht. Wenn Sie es auf Latin-1 setzen würden, funktionieren alle Byte-Unicode-Dekodierungen auf magische Weise, ergeben aber keinen Sinn, wenn Sie es auf UTF-8 setzen, funktionieren alle Unicode-Byte-Kodierungen, ergeben aber unter Umständen keinen Sinn Sie können Ihr Bein effektiv vorspabeln, falls es bricht, anstatt zu vermeiden, dass Sie Ihr Bein brechen. –

+0

Sieht aus wie ein [Workflow] (https://xkcd.com/1172/) Problem für mich. Gibt es ein realeres/expliziteres Beispiel? –

Verwandte Themen