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
是两个字节,97
和 0
。如果您将它们当作两个 ASCII 字符而不是一个 UTF-16-LE 字符来阅读,您将得到 a
后跟 [=16=]
.
请注意,您返回的实际上不是 'a[=17=]a[=17=]a[=17=]'
,而是 b'a[=18=]a[=18=]a[=18=]'
。因此,您 可以 将它们缓冲到 bytes
或 bytearray
中,然后在其上使用 decode('utf-16-le')
。但这违背了一次读取一个字符的目的。
最简单的解决方法是使用 getwch
而不是 getch
。这将主要做你想做的事——return 一个像 'a'
这样的单字符 str
值,而不是两个单独的单字节 bytes
值。
星体字符(U+FFFF
以上的所有内容)显示为两个独立的替代字符而不是一个字符可能仍然存在一些问题,"special keys" 仍将显示为 Unicode U+0000
或 U+00E0
后跟一个键码(或者,如果你有一个旧的 Python,可能是一个损坏的 U+E0xx
,键码嵌入在字符中)。但除此之外,它将按您预期的方式工作。
我正在编写一个简单的 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
是两个字节,97
和 0
。如果您将它们当作两个 ASCII 字符而不是一个 UTF-16-LE 字符来阅读,您将得到 a
后跟 [=16=]
.
请注意,您返回的实际上不是 'a[=17=]a[=17=]a[=17=]'
,而是 b'a[=18=]a[=18=]a[=18=]'
。因此,您 可以 将它们缓冲到 bytes
或 bytearray
中,然后在其上使用 decode('utf-16-le')
。但这违背了一次读取一个字符的目的。
最简单的解决方法是使用 getwch
而不是 getch
。这将主要做你想做的事——return 一个像 'a'
这样的单字符 str
值,而不是两个单独的单字节 bytes
值。
星体字符(U+FFFF
以上的所有内容)显示为两个独立的替代字符而不是一个字符可能仍然存在一些问题,"special keys" 仍将显示为 Unicode U+0000
或 U+00E0
后跟一个键码(或者,如果你有一个旧的 Python,可能是一个损坏的 U+E0xx
,键码嵌入在字符中)。但除此之外,它将按您预期的方式工作。