>>> print 'абвгд'
абвгд
При вводе некоторых символов ваш терминал решает, как эти символы представлены в приложении. Ваш терминал может предоставить символы приложениям, закодированным как utf-8, ISO-8859-5, или даже то, что понимает только ваш терминал. Python получает эти символы как некоторую последовательность байтов. Затем python выводит эти байты так, как они есть, и ваш терминал каким-то образом интерпретирует их для отображения символов. Так как ваш терминал обычно интерпретирует байты таким же образом, как он закодирован их прежде, все отображается, как вы ввели его.
>>> u'абвгд'
Здесь вы вводите в некоторых символов, которые поступают на питона переводчика в виде последовательности байтов, возможно, каким-то образом закодирован терминалом. С префиксом u
python пытается преобразовать эти данные в unicode. Для этого python должен знать, какую кодировку использует ваш терминал. В вашем случае похоже, что Python догадывается, что кодирование ваших терминалов будет ASCII, но полученные данные не соответствуют этому, поэтому вы получаете ошибку кодирования.
Прямой вперед способ создания Юникода строки в интерактивной сессии поэтому было бы что-то подобное это:
>>> us = 'абвгд'.decode('my-terminal-encoding')
В файлах вы можете также указать кодировку файла с помощью специального режима линии:
# -*- encoding: ISO-8859-5 -*-
us = u'абвгд'
Для других способов установки кодировки ввода по умолчанию вы можете посмотреть sys.setdefaultencoding(...)
или sys.stdin.encoding
.
Да, это имеет для меня большой смысл, спасибо. – disc0dancer
+1 очень полный ответ –