msvcrt.getch()每次都检测空间

时间:2018-04-27 20:04:19

标签: python windows python-3.x msvcrt getch

我正在编写一个简单的python代码,该代码应该检测我的击键,但出于某种原因,在单次击键后检测到空格。

代码:

import msvcrt

print("press 'escape' to quit...")
text=""
while 1:
    char = msvcrt.getch()
    print(ord(char))

示例运行:

Input: aaaaa

Output:
97
0
97
0
97
0
97
0
97
0

1 个答案:

答案 0 :(得分:1)

它没有检测到空间。空格为32,而非0

发生的事情是您使用的是宽字符终端,但是将其作为字节读取,因此您可以看到UTF-16-LE字节。在UTF-16-LE中,a是两个字节970。如果您将它们看作是两个ASCII字符而不是一个UTF-16-LE字符,那么您将a后跟\0

请注意,您获得的内容实际上并非'a\0a\0a\0',而是b'a\0a\0a\0'。因此,可以将这些内容缓冲到bytesbytearray并在其上使用decode('utf-16-le')。但这无法一次读取一个角色的目的。

最简单的解决方法是使用getwch代替getch。这主要是做你想做的事情 - 返回像str这样的单字符'a'值而不是两个单独的单字节bytes值。

星界角色(U+FFFF以上的所有内容)可能仍然存在一些问题,这些角色显示为两个单独的代理而不是一个单个字符,以及"特殊键"仍将显示为Unicode U+0000U+00E0后跟一个键码(或者,如果您有一个较旧的Python,可能是一个损坏的U+E0xx,其中键码嵌入在该字符中)。但除此之外,它会按照您的预期运作。