2012-04-23 6 views
8
>>> a = "我" # chinese 
>>> b = unicode(a,"gb2312") 
>>> a.__class__ 
<type 'str'> 
>>> b.__class__ 
<type 'unicode'> # b is unicode 
>>> a 
'\xce\xd2' 
>>> b 
u'\u6211' 

>>> c = u"我" 
>>> c.__class__ 
<type 'unicode'> # c is unicode 
>>> c 
u'\xce\xd2' 

b und c sind alle Unicode, aber >>> b Ausgänge u'\u6211' und >>> c Ausgänge u'\xce\xd2', warum?Unicode und `decode()` in Python

+0

Welches Terminal verwenden Sie? Ich kann die Ergebnisse nicht auf meinem Unicode Gnome-Terminal reproduzieren ('c === u '\ u6211'') –

+0

@ChrisMorgan Ich teste diese Codes in IDLE. –

+0

kann dies auch mit IDLE repro –

Antwort

12

Wenn Sie "我" eingeben, erhält der Python-Interpreter vom Terminal eine Darstellung dieses Zeichens in Ihrem lokalen Zeichensatz, die aufgrund der "" Byte-für-Byte in einer Zeichenfolge gespeichert wird. Auf meinem UTF-8-System ist das . Bei Ihnen ist es '\xce\xd2', weil Sie GB2312 verwenden. Das erklärt den Wert Ihrer Variablen a.

Wenn Sie u"我" eingeben, der Python-Interpreter nicht weiß, welche Codierung des Charakter ist, was es tut, ist so ziemlich das gleiche wie für einen gewöhnlichen string:. Speichert er die Bytes des Zeichens in einem Unicode-String, interpretieren jedes Byte als Unicode-Codepunkt, daher das falsche Ergebnis u'\xce\xd2' (oder, auf meiner Box, u'\xe6\x88\x91').

Dieses Problem besteht nur im interaktiven Interpreter. Wenn Sie Python-Skripte oder -Module schreiben, können Sie specify the encoding in der Nähe der Spitze und Unicode-Strings kommen richtig. Zum Beispiel auf meinem System, druckt das folgende das Wort liberté zweimal:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

print(u"liberté") 
print("liberté") 
0

Die interaktive Python-Show Darstellung eines Objekts, wenn Sie nur typ in seinem Namen. Auf der anderen Seite versucht der Befehl print das Zeichen zu rendern. Ihre Variable mit dem Namen a ist vom Typ String. Tatsächlich sind Strings in Python 2.x eine Reihe von Bytes. Es hängt also von Ihrer Arbeitsumgebung ab. Sie sagen zu der Funktion unicode(), dass Sie jetzt die Kodierung gb2312 verwenden. Wenn es wahr ist, dann enthält b die korrekte Darstellung des Zeichens in der gegebenen Kodierung.

Versuchen Sie,

>>> print b 

in Ihrem Fall. Es ist wahrscheinlich, dass Sie das gewünschte Ergebnis sehen werden. Versuchen Sie auch:

>>> print repr(a) 
... 
>>> print repr(b) 

Die Darstellung ist (wenn möglich) eine Textzeichenfolge, die beim Kopieren-Einfügen auf einen Quellcode würde das Objekt mit dem gleichen Wert schaffen.

Werfen Sie einen Blick auf Mark Pilgrims "Dive Into Python 3", Kapitel 4. Strings (http://getpython3.com/diveintopython3/strings.html) für eine schöne, lesbare Erklärungen.