python getpass 编码问题
假设我有以下代码:
# -*- coding: utf-8 -*-
from getpass import getpass
#print u'Введите пароль!'.encode('cp866')
passwd = getpass (u'Введите пароль!'.encode('cp866'))
这段代码是用来让用户在Windows控制台输入密码的(所以编码方式是'cp866')。用户看到的提示是:“???¤?a? ? aR?i!” 但是如果你取消注释那行打印语句,你就能看到正确的文本。
我已经找到了一种解决办法,先打印一条信息,然后再用空提示调用getpass,但我就是想知道我的代码到底出了什么问题,为什么会得到这样的结果?
这里有个提示,可能会让事情更清楚:getpass使用msvcrt.putch (char)来在控制台上显示字符。
2 个回答
0
在我看来,Python中的Unicode处理真的是让人感到尴尬。时不时我会在一些库中遇到这些问题,这些库对UTF的理解很有限。就像kichik的回答中提到的,大多数情况下,唯一的解决办法就是把编码改成一种老旧的格式。你可以查看一下这个链接 http://bugs.python.org/issue1436203,看看你遇到的具体问题。
不过,如果你的网站是完全使用Unicode的,那这种方法可能就不适用了。在这种情况下,你唯一的选择就是用raw_input、sys.stdin等方法来重复实现所谓的“可移植”getpass功能。
1
putch()
这个函数可能会自己把你用的ANSI编码(cp1251)转换成OEM编码(cp866)。你可以试着直接用cp1251来编码。