msvcrt.getch() 每次检测到 space

msvcrt.getch() detects space every time

我正在编写一个简单的 python 代码来检测我的击键,但出于某种原因在每次击键后检测 space。

代码:

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

它没有检测到 space。 Space 是 32,而不是 0

发生的情况是您使用的是宽字符终端,但以字节形式读取它,所以您看到的是 UTF-16-LE 字节。在 UTF-16-LE 中,a 是两个字节,970。如果您将它们当作两个 ASCII 字符而不是一个 UTF-16-LE 字符来阅读,您将得到 a 后跟 [=16=].

请注意,您返回的实际上不是 'a[=17=]a[=17=]a[=17=]',而是 b'a[=18=]a[=18=]a[=18=]'。因此,您 可以 将它们缓冲到 bytesbytearray 中,然后在其上使用 decode('utf-16-le')。但这违背了一次读取一个字符的目的。

最简单的解决方法是使用 getwch 而不是 getch。这将主要做你想做的事——return 一个像 'a' 这样的单字符 str 值,而不是两个单独的单字节 bytes 值。

星体字符(U+FFFF 以上的所有内容)显示为两个独立的替代字符而不是一个字符可能仍然存在一些问题,"special keys" 仍将显示为 Unicode U+0000U+00E0 后跟一个键码(或者,如果你有一个旧的 Python,可能是一个损坏的 U+E0xx,键码嵌入在字符中)。但除此之外,它将按您预期的方式工作。