msvcrt.getch () каждый раз обнаруживает пробел - PullRequest
0 голосов
/ 27 апреля 2018

Я пишу простой код на 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 голосов
/ 27 апреля 2018

Это не обнаружение пространства. Пространство 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 с кодом ключа, встроенным в символ). Но в противном случае все будет работать так, как вы ожидали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...