Frage

Ich versuche, wie Python 2.5 befasst sich mit Unicode-Strings zu verstehen. Obwohl mittlerweile glaube ich, ein gutes Verständnis davon, wie ich soll sie in Code zu handhaben, verstehe ich nicht ganz, was hinter den Kulissen vor sich geht, vor allem wenn Sie Zeichenfolgen an der Dolmetscheraufforderung eingeben.

So Python 3.0 hat zwei Arten für Strings vor, nämlich: str (Byte-Strings) und unicode, die beide von basestring ableiten. Der Standardtyp für Strings ist str.

str Objekte keine Ahnung von ihrer eigentlichen Codierung haben, sie sind nur die Bytes. Entweder Sie haben einen Unicode-String selbst verschlüsselt und daher wissen, welche Kodierung sie sind in, oder Sie haben einen Strom von Bytes, deren Codieren Sie auch vorher wissen (indeally) lesen. Sie können die Codierung eines Byte-String, dessen erraten Codierung ist Ihnen unbekannt, aber es ist einfach kein zuverlässiger Weg, um dies herauszufinden. Ihre beste Wette ist früh zu entschlüsseln, verwendet Unicode überall in Ihrem Code und kodieren spät.

Das ist in Ordnung. Aber Strings in den Interpreter eingegeben werden in der Tat für Sie hinter Ihrem Rücken codiert? Vorausgesetzt, dass mein Verständnis von Strings in Python richtig ist, was die Methode ist / Python Einstellung verwendet diese Entscheidung zu treffen?

Die Quelle meiner Verwirrung sind die unterschiedlichen Ergebnisse, die ich bekomme, wenn ich die gleiche Sache auf meinem System der Python-Installation versuchen, und auf meinem Editor eingebetteten Python-Konsole.

 # Editor (Sublime Text)
 >>> s = "La caña de España"
 >>> s
 'La ca\xc3\xb1a de Espa\xc3\xb1a'
 >>> s.decode("utf-8")
 u'La ca\xf1a de Espa\xf1a'
 >>> sys.getdefaultencoding()
 'ascii'

 # Windows python interpreter
 >>> s= "La caña de España"
 >>> s
 'La ca\xa4a de Espa\xa4a'
 >>> s.decode("utf-8")
 Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
   File "C:\Python25\lib\encodings\utf_8.py", line 16, in decode
     return codecs.utf_8_decode(input, errors, True)
 UnicodeDecodeError: 'utf8' codec can't decode byte 0xa4 in position 5: unexpected code byte
 >>> sys.getdefaultencoding()
 'ascii'
War es hilfreich?

Lösung

Lassen Sie mich Ignacio Antwort erweitern: In beiden Fällen gibt es eine zusätzliche Schicht zwischen Python und Sie: in einem Fall ist es Sublime Text und in der anderen ist es cmd.exe. Der Unterschied im Verhalten, das Sie sehen, ist nicht aufgrund von Python, sondern durch die verschiedenen Codierungen, die von Sublime Text (utf-8, wie es scheint) und cmd.exe (CP437).

Wenn Sie also ñ geben, Sublime Text sendet '\xc3\xb1' zu Python, während cmd.exe \xa4 sendet. [Ich bin simplyfing hier Details weggelassen, die auf die Frage nicht relevant sind.].

Dennoch weiß Python darüber. Von cmd.exe bringen Sie wahrscheinlich so etwas wie:

>>> import sys
>>> sys.stdin.encoding
'cp437'

während in Sublime Text Sie werden so etwas wie

erhalten
>>> import sys
>>> sys.stdin.encoding
'utf-8'

Andere Tipps

Der Interpreter verwendet Ihre Eingabeaufforderung der nativen Codierung für die Texteingabe. In Ihrem Fall ist es CP437:

>>> print '\xa4'.decode('cp437')
ñ

Sie sind immer verwirrt, weil der Herausgeber und der Interpreter verwenden unterschiedliche Kodierungen selbst. Das Python-Interpreter verwendet Ihren System-Standard (in diesem Fall cp437), während des Editor utf-8 verwendet.

Beachten Sie, verschwindet der Unterschied, wenn Sie einen Unicode-String angeben, etwa so:

# Windows python interpreter
>>> s = "La caña de España"
>>> s
'La ca\xa4a de Espa\xa4a'
>>> s = u"La caña de España"
>>> s
u'La ca\xf1a de Espa\xf1a'

Die Moral von der Geschichte? Codierungen sind heikel. Seien Sie sicher, dass Sie wissen, was die Kodierung der Quelldateien in sind, oder es sicher spielen, indem sie immer die maskierte Version von Sonderzeichen verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top