python getpass 编码问题

5 投票
2 回答
1443 浏览
提问于 2025-04-16 06:44

假设我有以下代码:

  # -*- 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来编码。

撰写回答