2012-04-23 18 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 i c są Unicode, ale >>> b wyjścia u'\u6211' i >>> c wyjścia u'\xce\xd2', dlaczego?Unicode i `dekodowania()` w Pythonie

+0

Jakiego terminala używasz? Nie mogę odtworzyć wyników na moim gnome-terminal Unicode ('c === u '\ u6211'') –

+0

@ChrisMorgan I przetestować te kody w IDLE. –

+0

może również repro this z IDLE –

Odpowiedz

12

Po wpisaniu , interpreter Pythona pobiera z terminalu reprezentację tego znaku w lokalnym zestawie znaków, który przechowuje w bajcie bajt-bajt z powodu "". W moim systemie UTF-8 jest to . Na twoim, to jest '\xce\xd2', ponieważ używasz GB2312. To wyjaśnia wartość zmiennej a.

Po wprowadzeniu u"我", interpreter Pythona nie wie, jakie kodowanie znaków jest co robi jest prawie taka sama, jak dla zwykłego sznurka. Przechowuje bajtów znaku w ciągu znaków Unicode, interpretując każdy bajt jako kod kodowy Unicode, stąd błędny wynik: u'\xce\xd2' (lub, na moim pudełku, u'\xe6\x88\x91').

Ten problem występuje tylko w Interaktywnym tłumaczu. Kiedy piszesz skrypty lub moduły w języku Python, możesz w pobliżu górnej krawędzi wpisać specify the encoding, a ciągi znaków Unicode będą wyświetlane poprawnie. Na przykład w moim systemie, następujące drukuje Słowo Liberté dwukrotnie:

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

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

Interaktywny Python pokazu reprezentacja obiektu po prostu wpisać w jego imieniu. Z drugiej strony, polecenie drukowania próbuje renderować znak. Twoja zmienna o nazwie a jest typu ciąg. W rzeczywistości łańcuchy w Pythonie 2.x są serią bajtów. To zależy od twojego środowiska pracy. Mówisz do funkcji unicode(), że używasz teraz kodowania gb2312. Jeśli jest to prawda, wówczas b zawiera poprawną reprezentację znaku w danym kodowaniu.

Spróbuj

>>> print b 

w Twoim przypadku. Prawdopodobnie zobaczysz pożądany wynik. Spróbuj również:

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

reprezentacja jest (jeśli to możliwe) ciąg tekstowy, że kiedy kopia wklejony do kodu źródłowego, by utworzyć obiekt o tej samej wartości.

Spójrz na "Dive Into Python 3" Marka Pilgrima, rozdział 4. Struny (http://getpython3.com/diveintopython3/strings.html), aby uzyskać ładne, czytelne wyjaśnienia.