我正在编写一个简单的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
答案 0 :(得分:1)
它没有检测到空间。空格为32
,而非0
。
发生的事情是您使用的是宽字符终端,但是将其作为字节读取,因此您可以看到UTF-16-LE字节。在UTF-16-LE中,a
是两个字节97
和0
。如果您将它们看作是两个ASCII字符而不是一个UTF-16-LE字符,那么您将a
后跟\0
。
请注意,您获得的内容实际上并非'a\0a\0a\0'
,而是b'a\0a\0a\0'
。因此,可以将这些内容缓冲到bytes
或bytearray
并在其上使用decode('utf-16-le')
。但这无法一次读取一个角色的目的。
最简单的解决方法是使用getwch
代替getch
。这主要是做你想做的事情 - 返回像str
这样的单字符'a'
值而不是两个单独的单字节bytes
值。
星界角色(U+FFFF
以上的所有内容)可能仍然存在一些问题,这些角色显示为两个单独的代理而不是一个单个字符,以及"特殊键"仍将显示为Unicode U+0000
或U+00E0
后跟一个键码(或者,如果您有一个较旧的Python,可能是一个损坏的U+E0xx
,其中键码嵌入在该字符中)。但除此之外,它会按照您的预期运作。