Does one have to use curses to read single characters from keyboard?

Cameron Simpson cs at cskk.id.au
Sun Dec 11 17:54:11 EST 2022


On 11Dec2022 22:22, Barry Scott <barry at barrys-emacs.org> wrote:
>>    # Get a single character, setcbreak rather than setraw meands 
>>    CTRL/C
>>    etc. still work
>>    #
>>    def getch():
>>        sys.stdout.flush()
>>        tty.setcbreak(fdInput)
>>        ch = sys.stdin.buffer.raw.read(1).decode(sys.stdin.encoding)
>
>Will not work for uncode code points above 255.

Aye. But one could write a little loop to collect bytes until a complete 
character was received. A little experiment:

     >>> try: bytes((0xf0,)).decode('utf8')
     ... except UnicodeDecodeError as e:
     ...   e2=e
     ...
     >>> e2
     UnicodeDecodeError('utf-8', b'\xf0', 0, 1, 'unexpected end of data')
     >>> e2.reason
     'unexpected end of data'

Keep collecting while you get `UnicodeDecodeError`s with a `.reason` of 
'unexpected end of data'. Can be encoding agnostic (obviously you need 
to _choose_ an encoding, it is needn't be utf-8).

(For the OP: `UnicodeDecodeError` doesn't necessarily mean you're 
decoding Unicode data, you're decoding _into_ a Python string which is a 
Unicode string.)

Cheers,
Cameron Simpson <cs at cskk.id.au>


More information about the Python-list mailing list