Теперь я вижу, где вы запутались. Давайте посмотрим на это:
x = '\xd0\xa4'
y = '\x92'
Если я print x
, я получаю Ф. Это потому, что мой терминал использует UTF-8 в качестве кодировки символов. Таким образом, когда он получает D0 A4
, он пытается декодировать его как UTF-8 и получает «Ф». Если я изменю свой терминал на использование, скажем, ISO-8859-1 ("latin1"), и я скажу print x
, мой терминал попытается декодировать D0 A4
с использованием ISO-8859-1, и, поскольку D0 A4
также допустимая строка ISO-8859-1, она будет декодироваться, но на этот раз в «Ð¤».
Теперь для print y
. Это не строка UTF-8, поэтому мой терминал не может это декодировать. Это показывает мне эту ошибку, в моем случае, печатая « ». Мне интересно, если вы видите " " или "?" - вы, вероятно, должны увидеть первое, но это зависит от того, что ваш терминал делает перед лицом плохого вывода.
Кодировка вашего терминала должна совпадать с тем, что говорит $LANG
, и ваша программа должна выводить данные в любой кодировке, указанной $LANG
. В настоящее время $LANG
обычно составляет ???.UTF-8
, где ???
изменяется. (Мой en_US.UTF-8
)
Теперь, когда вы говорите unicode(y, 'utf8')
, Python пытается декодировать это как UTF-8 и соответственно выдает исключение.
Я использую Gnome Terminal и могу изменить свою кодировку, перейдя в Терминал → Установить кодировку символов