N-curses в Python: как поймать и напечатать не ascii символ? - PullRequest
1 голос
/ 30 мая 2019

Я хочу сделать небольшую программу с помощью ncurses / python и иметь возможность использовать / печатать на французском и японском языках. Я понимаю, что должен установить язык и использовать стандарт Unicode.

Но как бороться с результатом из screen.getch ()? Я хотел бы отображать напечатанный символ в окне ncurses независимо от языка.

Я понимаю, что необходимо некоторое преобразование в Юникод, но не могу найти, что делать (и я довольно долго искал: это дело преобразования символов нелегко понять любителям).

Дополнительный вопрос: кажется, что для символов, отличных от ascii, мы должны использовать addstr () вместо addch (). Точно так же я должен использовать getstr () вместо getch ()?

#!/usr/bin/python3
# -*- coding: utf-8 -*-
import curses
from curses import wrapper
import locale

locale.setlocale(locale.LC_ALL, '')

def main(scr):
    # Following lines are some sort of "proof of concept"
    # Indeed it print latin or japanese characters allright
    scr.addstr(0, 0, u'\u3042'.encode('utf-8')) # print あ
    scr.addstr(1, 0, 'é'.encode('utf-8'))       # print é

    # But here I would like to type in a character and have it displayed onscreen
    while (True):
        car = scr.getch()
        if car == 27: # = Escape key
            break
        else:
        # What should I put between those parenthesis to
        # print the typed character on the third line of the screen 
            scr.addstr(3, 0, ???? )

wrapper(main)

Ответы [ 2 ]

1 голос
/ 30 мая 2019

unctrl - это функция, которую нужно использовать, для результатов из getch:

curses.unctrl( ch)

Возвращает строку, которая является печатаемым представлением символа ch.Управляющие символы отображаются в виде каретки, за которой следует символ, например, ^C.Печатные символы остаются без изменений.

Если вы хотите читать UTF-8 напрямую, используйте get_wch (который не был доступен в оболочке python2):

окно. get_wch ([y, x])

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

Новое в версии 3.3 .

даже с что , вы все равно должны убедиться, что локаль инициализирована.Документация Python предполагает, что у вас есть доступ к документации ncurses:

0 голосов
/ 31 мая 2019

getch / getkey не работают в Python.Предполагается, что они возвращают символ, когда кодирование настроено так, как задокументировано, но вместо этого они возвращают октеты из последовательности UTF-8 по одному при каждом вызове функции.Вам нужно обойти дефект, собирая октеты в цикле, пока у вас не получится полная последовательность.Последовательность завершается, когда она может быть успешно декодирована, в противном случае она неполная.

Сравните со следующей программой, которая прекрасно работает (работает с perl -C so-56373360.pl):

use Term::ReadKey qw(ReadKey ReadMode);
ReadMode 'raw';
while () {
    my $c = ReadKey 0;
    last if $c eq "\e"; # Escape
    print $c;
}
ReadMode 'restore';
...