Python 2.7中使用raw_input()读取德语变音符号

1 投票
1 回答
1744 浏览
提问于 2025-04-18 00:44

我是一名编程初学者,正在为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

在Stack Overflow上,其他关于变音符号(umlauts)的问题似乎都指向代码的第一行,或者是对字符串进行解码以转换成unicode。但在每种情况下,用户都是直接把字符串输入到代码中,而不是用raw_input()来读取,这样我总是会收到错误信息。

1 个回答

5

你似乎是在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)

撰写回答