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