Kann mir jemand diese seltsame Sache erklären:
In der Python-Shell gebe ich die folgende kyrillische Zeichenfolge ein:
%Vor%aber wenn ich tippe:
%Vor%Da das erste tring richtig ausgegangen ist, rechne ich mein OS X Terminal kann Unicode darstellen, aber es stellt sich heraus, dass es im zweiten Fall nicht möglich ist. Warum?
Wenn Sie einige Zeichen eingeben, entscheidet Ihr Terminal, wie diese Zeichen für die Anwendung dargestellt werden. Ihr Terminal könnte die Zeichen für die Anwendung als utf-8, ISO-8859-5 oder sogar als etwas, das nur Ihr Terminal versteht, codieren. Python erhält diese Zeichen als eine Folge von Bytes. Dann druckt Python diese Bytes so aus, wie sie sind, und Ihr Terminal interpretiert sie auf irgendeine Weise, um Zeichen anzuzeigen. Da Ihr Terminal normalerweise die Bytes auf die gleiche Weise interpretiert wie zuvor, wird alles so angezeigt, wie Sie es eingegeben haben.
%Vor% Hier geben Sie einige Zeichen ein, die am Python-Interpreter als eine Folge von Bytes ankommen, die auf irgendeine Weise vom Terminal kodiert werden können. Mit dem Präfix u
versucht Python, diese Daten in Unicode zu konvertieren. Um dies richtig zu tun, muss Python wissen, welche Kodierung Ihr Terminal verwendet. In Ihrem Fall sieht es so aus, als ob Python davon ausgeht, dass Ihre Terminalcodierung ASCII wäre, aber die empfangenen Daten stimmen nicht damit überein, so dass Sie einen Codierungsfehler erhalten.
Der direkte Weg, um Unicode-Strings in einer interaktiven Sitzung zu erstellen, wäre daher etwa so:
%Vor%In Dateien können Sie auch die Kodierung der Datei mit einer speziellen Moduszeile angeben:
%Vor% Für andere Möglichkeiten, die Kodierung für die Standardeingabe festzulegen, können Sie sich sys.setdefaultencoding(...)
oder sys.stdin.encoding
ansehen.
Ab Python 2.6 können Sie die Umgebungsvariable PYTHONIOENCODING
verwenden, um Python mitzuteilen, dass Ihr Terminal UTF-8-fähig ist. Der einfachste Weg, dies dauerhaft zu machen, besteht darin, die folgende Zeile zu Ihrem ~/.bash_profile
hinzuzufügen:
Zusätzlich zur Gewährleistung, dass Ihr OS X-Terminal auf UTF-8 eingestellt ist, möchten Sie möglicherweise Ihre Standardcodierung für python sys auf UTF-8 oder höher einstellen. Erstellen Sie eine Datei in /Library/Python/2.5/site-packages
namens sitecustomize.py
. In dieser Datei put:
Die setdefaultencoding
-Methode ist nur vom Site-Modul verfügbar und wird einmal aus dem sys-Namespace entfernt Startup abgeschlossen ist . Daher müssen Sie einen neuen Python-Interpreter starten, damit die Änderung wirksam wird. Sie können die aktuelle Standardcodierung jederzeit nach dem Start mit sys.getdefaultencoding()
überprüfen.
Wenn die Zeichen nicht bereits Unicode sind und Sie sie konvertieren müssen, verwenden Sie die decode
-Methode für eine Zeichenfolge, um den Text von einem anderen Zeichensatz in Unicode zu decodieren. Am besten geben Sie an, welcher Zeichensatz:
Ein Unicode-Objekt muss codiert werden, bevor es auf einigen Konsolen angezeigt werden kann. Probieren Sie
aus %Vor%stattdessen, um den Unicode zu einem String-Objekt zu kodieren (höchstwahrscheinlich utf8 als Standard-Encoding zu benutzen, hängt aber von Ihrer Python-Konfiguration ab)
'абвгд' ist keine Unicode-Zeichenfolge
u'абвгд 'ist eine Unicode-Zeichenfolge
Sie können Unicode-Strings nicht drucken, ohne sie zu codieren. Wenn Sie in Ihrer Anwendung mit Strings arbeiten, möchten Sie sicherstellen, dass jede Eingabe dekodiert und jede Ausgabe codiert wird. Auf diese Weise behandelt Ihre Anwendung intern nur Unicode-Strings und gibt Strings in UTF8 aus.
Als Referenz:
%Vor%