2012-04-23 3 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 и c все Юникода, но >>> b выходы u'\u6211' и >>> c выходы u'\xce\xd2', почему?Unicode, и `декодирования()` в Python

+0

Какой терминал вы используете? Я не могу воспроизвести результаты на моем юникоде gnome-terminal ('c === u '\ u6211'') –

+0

@ChrisMorgan Я тестирую эти коды в IDLE. –

+0

также может воспроизвести это с помощью IDLE –

ответ

12

При вводе "我" интерпретатор Python получает из терминала представление этого символа в вашем локальном наборе символов, которое хранится в строковом байтовом байте из-за "". В моей системе UTF-8 это '\xe6\x88\x91'. На вашем, это '\xce\xd2', потому что вы используете GB2312. Это объясняет ценность вашей переменной a.

При входе u"我", интерпретатор Python не знает, какой кодирующий характер в Что она делает это почти так же, как и для обычной строки:. Он хранит байт символа в строке Unicode, интерпретируя каждый байт как кодовый код Юникода, следовательно, неправильный результат u'\xce\xd2' (или, на моей коробке, u'\xe6\x88\x91').

Эта проблема существует только в интерактивном интерпретаторе. Когда вы пишете скрипты или модули Python, вы можете найти specify the encoding, а строки Unicode выйдут правильно. Например, в моей системе, следующий печатает слово Liberte дважды:

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

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

интерактивный Python шоу представление объекта, когда вы просто введите в его названии. С другой стороны, команда печати пытается отобразить символ. Ваша переменная с именем a имеет тип строки. Собственно, строки в Python 2.x - это серия байтов. Таким образом, это зависит от вашей рабочей среды. Вы скажете функции unicode(), что теперь вы используете кодировку gb2312. Если это так, то b содержит правильное представление символа в данной кодировке.

Попробуйте

>>> print b 

в вашем случае. Вероятно, вы увидите желаемый результат. Попробуйте также:

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

Это представление (если это возможно) текстовую строку, которая при копировании-вставке в исходный код будет создавать объект с тем же значением.

Посмотрите на «Погружение в питон 3» Марка Пилигрима, главы 4. Струны (http://getpython3.com/diveintopython3/strings.html) для приятных и понятных объяснений.

Смежные вопросы