Немецкие умлауты читаются с помощью raw_input() в Python 2.7

Я новичок в программировании, пишу простую консольную программу с карточками для iPython, чтобы учить немецкие слова. Ключ ответа — это файл Excel, который я читаю, упорядочиваю и сохраняю как строки Unicode. Проблема возникает, когда пользователю нужно ввести в консоль немецкое слово.

У меня это вверху:

# -*- coding: utf-8 -*-

а потом я прочитал (набрав в консоли) немецкое слово Kaufhäuser

var = raw_input().decode('utf-8')

Затем, как только я ввожу его в консоль, я получаю следующую ошибку:

UnicodeDecodeError: 'utf8' codec can't decode byte 0x84 in position 5: 
invalid start byte

Другие решения по переполнению стека, связанные с умляутами, похоже, указывают на первую строку кода или декодируют строку, чтобы превратить ее в юникод. Но в каждом случае пользователь вводит строку в код, а не читает ее с помощью raw_input(), и я всегда получаю сообщение об ошибке.


person user3482876    schedule 31.03.2014    source источник
comment
Объявление кодировки в начале файла здесь совершенно неуместно.   -  person Daniel Roseman    schedule 01.04.2014


Ответы (1)


Похоже, вы запускаете код в консоли Windows. Консоль не использует UTF-8, она использует кодовую страницу, возможно, кодовую страницу 437. Если вы декодируете его с помощью «cp437», вы должны получить правильный Unicode или, что еще лучше, использовать sys.stdin.encoding, чтобы всегда получать правильную кодировку консоли.

var = raw_input().decode(sys.stdin.encoding)

Изменить: небольшой эксперимент показывает, что sys.stdin.encoding возвращает None при перенаправлении ввода. Более надежное решение:

# get correct encoding and use it to decode user input
encoding = 'utf-8' if sys.stdin.encoding in (None, 'ascii') else sys.stdin.encoding
var = raw_input().decode(encoding)
person Mark Ransom    schedule 31.03.2014