Обработка символов Python в терминале

Я нахожусь в интерактивном терминале Python 2.7 (вывод терминала по умолчанию "utf-8"). У меня есть строка из Интернета, давайте называть это a

>>> a
u'M\xfcssen'
>>> a[1]
u'\xfc'

Интересно, почему его значение не ü так что я стараюсь

>>> print(a)
Müssen
>>> print(a[1])
ü

который работает как задумано.

Итак, мой первый вопрос: что print a делать, чего не хватает, если я просто наберу a?

и из любопытства: почему я получаю другой вывод для следующего в том же сеансе терминала Python?

>>> "ü"
'\xc3\xbc'
>>> print "ü"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/codecs.py", line 351, in write
    data, consumed = self.encode(object, self.errors)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)
>>> print u"ü"
ü

2 ответа

Решение

Вы должны понимать, как python хранит различные типы данных и какие функции ожидают ввода. Все это довольно запутанно, а также зависит от настроек вашего терминала.

Следующая ссылка может помочь уменьшить путаницу: https://pythonhosted.org/kitchen/unicode-frustrations.html

Все str такие объекты, как "My String" хранятся как 8 бит на символ. В твоем случае '\xc3\xbc' является представлением UMLAUT-U в формате utf8 как str объект.

За unicode объекты, Python использует 16-битное или 32-битное целое число для хранения строки.

Теперь print функция ожидает str объекты в качестве ввода. Вот почему работает следующее.

>>> print '\xc3\xbc'
ü

Чтобы превратить UMLAUT-U из str в unicode объект. Вы должны сказать Python, что строка находится в представлении UTF8, прежде чем конвертировать ее в unicode объект.

>>> unicode('\xc3\xbc'.decode('utf8'))
u'\xfc'

что значит print a делать, чего не хватает, если я просто наберу a?

Интерактивный >>> Подсказка выводит значения, используя представление значения в исходном коде Python, возвращаемое repr() функция. Вот почему вы получаете не просто \xFC для ü символ, а также кавычки вокруг строки. Приглашение пытается показать вам, что вам нужно было бы ввести в программу Python, чтобы получить строковое значение, которое у вас есть.

print оператор выводит преобразование необработанной строки значения, возвращаемого str() функция.

Для некоторых типов repr() а также str() генерировать тот же вывод, но это не относится к строкам.

Другие вопросы по тегам