Python Curses, чтение атрибута широкого символа с экрана

Проблема, которую я пытаюсь решить, состоит в том, чтобы получить пару ch,att, представляющую символ и связанный с ним атрибут, отображаемый в данный момент в некоторой заданной позиции.

Теперь, когда отображаемый символ не является широким (т. е. символом ASCII), метод .inch выполняет работу вплоть до корректной маскировки результатов. Проблема возникает, когда отображаемый символ широкий. Точнее я знаю, как получить данный символ через .instr, однако эта функция не возвращает никакой информации об атрибуте.

Поскольку, насколько мне известно, не существует специальной функции для получения одного только атрибута, моей первой попыткой было использовать .inch, отбросить 8 младших бит и интерпретировать результат как атрибут. Казалось, что это сработало до некоторой степени, но перепроверив, я понял, что чтение греческих букв (например, u"u\03b1") без атрибута таким образом возвращает att = 11.0000.0000 вместо 0. Есть ли лучший способ подойти к проблеме?

РЕДАКТИРОВАТЬ, минимальный пример для Python3

import curses

def bin(x):
    out = ''
    while x > 0:
        out = str(x % 2) + out
        x = x // 2

    return out

def main(s):
    s.addstr(1, 1, u'\u03b1')
    s.refresh()

    chratt = s.inch(1, 1)

    att = chratt & 0xFF00

    s.addstr(2, 1, bin(att))
    s.refresh()

    while True:
        pass

curses.wrapper(main)

person JayTuma    schedule 30.06.2021    source источник
comment
Будет лучше, если вы добавите фрагмент кода.   -  person nngeek    schedule 30.06.2021
comment
@nngeek, добавлен фрагмент   -  person JayTuma    schedule 30.06.2021
comment
@JayTuma, что ты имеешь в виду под широким?   -  person wowkin2    schedule 04.07.2021
comment
@ wowkin2 Под широким символом я подразумеваю тот, который в кодировке utf-8 не представлен одним байтом (символы, отличные от ASCII, чтобы быть более понятными)   -  person JayTuma    schedule 04.07.2021


Ответы (1)


В curses inch и instr предназначены только для символов ascii, как вы и подозревали. сложные или широкие символы, такие как символы из utf-8, имеют другую систему, как объяснил здесь, в stackoverflow, один из создателей ncurses.

Однако к плохим новостям. Они не реализованы в проклятиях Python (пока). Запрос на вытягивание был отправлен здесь и очень близок к слиянию (90%). так что, если вам это действительно нужно, то почему бы не внести свой вклад?

И если это не вариант, то вы можете попытаться сохранить каждое изменение, которое вы делаете на своем экране, в переменной, а затем извлекать оттуда широкие символы.

person j307    schedule 10.07.2021