Не удается получить символ степени в raw_input

Проблема в моем коде выглядит примерно так:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

deg = u'°'
print deg
print '40%s N, 100%s W' % (deg, deg)
codelim = raw_input('40%s N, 100%s W)? ' % (deg, deg))

Я пытаюсь сгенерировать приглашение raw_input для символов-разделителей внутри строки широты/долготы, и приглашение должно включать пример такой строки. print deg и print '40%s N, 100%s W' % (deg, deg) оба работают нормально — они возвращают «°» и «40° с.ш., 100° з.д.» соответственно — но шаг raw_input каждый раз терпит неудачу. Ошибка, которую я получаю, выглядит следующим образом:

Traceback (most recent call last):
  File "C:\Users\[rest of the path]\scratch.py", line 5, in  <module>
    x = raw_input(' %s W")? ' % (deg))
UnicodeEncodeError: 'ascii' codec can't encode character u'\xb0' in position 1:
ordinal not in range(128)

Я думал, что решу проблему, добавив заголовок кодировки, как указано a-word-document-using-docx">здесь (и действительно, это позволило вообще напечатать знак степени), но я все еще получаю ошибки Unicode, как только добавляю безопасный в остальном строка на raw_input. Что тут происходит?


person Photosynthetic    schedule 30.01.2015    source источник


Ответы (1)


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

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import sys

deg = u'°'

prompt = u'40%s N, 100%s W)? ' % (deg, deg)
codelim = raw_input(prompt.encode(sys.stdout.encoding))

40° N, 100° W)?

person Paul Rooney    schedule 30.01.2015
comment
Ошибка новичка. Упс. Считай, что исправлено. - person Photosynthetic; 01.02.2015
comment
Теперь разберемся, почему это работает. Хм. Это очень познавательно. Спасибо! - person Photosynthetic; 03.02.2015
comment
Строка имеет юникод, но raw_input не ожидает юникода (вероятно, он ожидает utf-8), поэтому он неправильно интерпретирует переданные ему байты, и вы получаете мусор. Вы можете взять строку Unicode и перекодировать ее, sys.stdin.encoding возвращает кодировку, используемую stdin для этой конкретной системы, поэтому ваш код теперь переносим, ​​чем если бы вы жестко кодировали prompt.encode("utf-8") - person Paul Rooney; 03.02.2015
comment
Обратите внимание на поправку к ответу. Должно быть sys.stdout.encoding, а не sys.stdin.encoding. Поскольку они почти наверняка возвращают одно и то же, все будет хорошо, но теперь это более правильно. - person Paul Rooney; 03.02.2015
comment
Ага, я понял. Спасибо! - person Photosynthetic; 03.02.2015