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