msvcrt.getch() detects space every time

杀马特。学长 韩版系。学妹 提交于 2019-12-11 05:24:28

问题


Im writting a simple python code that should detect the my keystrokes but for some reason in detects space after everysingle keystroke.

The code:

import msvcrt

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

Sample run:

Input: aaaaa

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

回答1:


It's not detecting space. Space is 32, not 0.

What's happening is that you're using a wide-character terminal, but reading it as bytes, so you're seeing the UTF-16-LE bytes. In UTF-16-LE, an a is two bytes, 97 and 0. If you read those as if they were two ASCII characters instead of one UTF-16-LE character, you'll get a followed by \0.

Notice that what you get back isn't actually 'a\0a\0a\0', but b'a\0a\0a\0'. So you could buffer these up into a bytes or bytearray and use decode('utf-16-le') on it. But that defeats the purpose of reading one character at a time.

The simplest fix is to use getwch instead of getch. This will mostly just do what you want—return a single-character str value like 'a' rather than two separate single-byte bytes values.

There may still be some problems with astral characters (everything above U+FFFF) showing up as two separate surrogates instead of one single character, and "special keys" will still show up as a Unicode U+0000 or U+00E0 followed by a keycode (or, if you have an older Python, possibly as a broken U+E0xx with the keycode embedded in the character). But otherwise, it'll work the way you expected.



来源:https://stackoverflow.com/questions/50069553/msvcrt-getch-detects-space-every-time

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!