Обработка символов 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()
генерировать тот же вывод, но это не относится к строкам.