msvcrt.getch()方法中的\ xe0是什么?

时间:2018-06-19 07:12:02

标签: python character-encoding

在msvcrt.getch()方法中,当我输入任何不在ascii表中的值时,我总是得到'\ xe0'。我不知道这意味着什么

>>>import msvcrt
>>>up_arrow = msvcrt.getch()
>>> # this is where I have inputed the up arrow
>>>print up_arrow
'\xe0'
>>>down_arrow = msvcrt.getch()
>>>
>>>print down_arrow
'\xe0'

1 个答案:

答案 0 :(得分:4)

the docs中解释了这一点:

  

如果按下的键是一个特殊的功能键,这将返回' \ 000'或者' \ xe0&#39 ;;下一个调用将返回键码。

正如您在the source中看到的那样,Python只是调用MSVCRT函数_getch,它有点像POSIX函数getch,但在一个键中有所不同方式:

  

当读取功能键或箭头键时,每个功能必须被调用两次;第一个调用返回0或0xE0,第二个调用返回实际的键代码。

历史原因可以追溯到Windows NT 3.x中的DOS兼容性(或者更确切地说,Turbo C用于Windows C的Microsoft C ++中的DOS兼容性)。

IIRC(我可能有一些细节错了......),基本的想法是这样的:你做一个BIOS调用来获得键盘的hi和lo值,这意味着每个键有一个16位的值。为了简化操作,Turbo C提供了一个很好的调用,可以将键映射到当前(8位)代码页中的字符,因此a会返回一个字节0x61。但是没有足够的空间来映射所有内容,所以像VK_UP这样的特殊键会在两个单独的调用中返回未映射,首先是hi字节0xE0然后是lo字节{{1} }。微软从Borland复制了它,以便更容易将代码移植到他们的编译器,然后将代码从DOS / Win3.1移植到NT,这就是MSVCRT今天仍在做什么,而Python只是包装了这个功能这样做。

This answer提供了更多详细信息。

当然在大多数Unix终端上,向上箭头也会发送一系列字符,通常与该字符的上移显示控制序列相同,通常为0x50,然后是ESC,然后[。但是人们不希望单个字符A类函数为Unix上的每个键返回单个值,所以没有人会感到困惑。