python getpass编码

时间:2010-11-08 14:24:46

标签: python windows encoding

想象一下,我有以下代码:

  # -*- coding: utf-8 -*-
  from getpass import getpass

  #print u'Введите пароль!'.encode('cp866')
  passwd = getpass (u'Введите пароль!'.encode('cp866'))

这是为了要求用户在Windows控制台中输入密码(因此编码为'cp866')。用户看到以下提示:“???¤?a?aR?i!” 但如果您使用print取消注释该行,您将看到正确的文本。 我已经有一个解决方法,首先制作一个print语句,然后发出带有空提示符的getpass,但我只是想知道我的代码到底出了什么问题,为什么我得到这个结果? 一个提示,如果它更清楚:getpass使用msvcrt.putch(char)将字符放在控制台上。

2 个答案:

答案 0 :(得分:1)

putch()可能会从您的ANSI代码页(cp1251)到您的OEM代码页(cp866)进行自己的翻译。请尝试使用cp1251进行编码。

答案 1 :(得分:0)

根据我的经验,unicode的状态在Python中非常令人尴尬。我不时在几个患有UTF近视的图书馆中遇到这些类型的问题。正如在kichik的回答中一样,大多数时候将编码改为古老的编码是唯一的解决方案。有关您的特定错误,请参阅http://bugs.python.org/issue1436203

但是,这可能不适用于仅使用unicode的站点范围方案。如果是这种情况,您唯一的选择就是使用raw_input,sys.stdin等来复制所谓的'protable'getpass的功能。