2012-04-23 11 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 e c sono tutti unicode, ma >>> b uscite u'\u6211' e >>> c uscite u'\xce\xd2', perché?Unicode e `decode()` in Python

+0

Quale terminale stai usando? Non riesco a riprodurre i risultati sul mio Unicode gnome-terminal ('c === u '\ u6211'') –

+0

@ChrisMorgan I testare questi codici in IDLE. –

+0

può anche riprodurlo con IDLE –

risposta

12

Quando si immette "我", l'interprete Python ottiene dal terminale una rappresentazione di quel carattere nel set di caratteri locale, che memorizza in una stringa byte per byte a causa dello "". Sul mio sistema UTF-8, questo è . Sul tuo, è '\xce\xd2' perché utilizzi GB2312. Questo spiega il valore della variabile a.

Quando si entra u"我", l'interprete Python non sa che codifica il carattere è in ciò che fa è più o meno lo stesso che per una stringa normale:. Memorizza il byte del carattere di una stringa Unicode, interpretando ogni byte come un punto di codice Unicode, quindi il risultato sbagliato u'\xce\xd2' (o, sulla mia scatola, u'\xe6\x88\x91').

Questo problema esiste solo nell'interprete interattivo. Quando si scrivono script o moduli Python, è possibile inserire specify the encoding nella parte superiore e le stringhe Unicode verranno visualizzate correttamente. Per esempio, sul mio sistema, la seguente stampa la parola liberté due volte:

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

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

Lo spettacolo interattivo di Python rappresentazione di un oggetto quando è sufficiente digitare in suo nome. D'altra parte, il comando print prova a rendere il personaggio. La variabile denominata a è di tipo stringa. In realtà, le stringhe in Python 2.x sono serie di byte. Quindi, dipende dal tuo ambiente di lavoro. Tu dici alla funzione unicode() che usi ora la codifica gb2312. Se è vero, allora b contiene la rappresentazione corretta del carattere nella codifica data.

Provare a

>>> print b 

nel tuo caso. È probabile che vedrai il risultato desiderato. Prova anche:

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

La rappresentazione è (se possibile) una stringa di testo che, quando copia-incollato ad un codice sorgente sarebbe creare l'oggetto con lo stesso valore.

Dai un'occhiata a "Dive Into Python 3" di Mark Pilgrim, Capitolo 4. Archi (http://getpython3.com/diveintopython3/strings.html) per una spiegazione chiara e leggibile.