Проклятия Python - ввод с клавиатуры textpad.Textbox() не работает с немецкими умляутами

Я пытаюсь использовать функцию curses textpad.Textbox() для ввода текста. Пока все работает нормально, однако некоторые клавиши не распознаются, в том числе знак раздела (§) и все немецкие умляуты (ä/ö/ü). Я предполагаю, что это как-то связано с кодировкой текста, но я понятия не имею, как это исправить. Моя немецкая раскладка клавиатуры отлично работает с input().

Вот минимальный пример:

    import curses
    import curses.textpad as textpad

    try:
        stdtscr = curses.initscr()
        curses.cbreak()
        stdtscr.keypad(1)
        curses.noecho()

        textpad.Textbox(stdtscr).edit()

    finally:
        curses.nocbreak()
        stdtscr.keypad(0)
        curses.echo()
        curses.endwin()

person lsgng    schedule 28.02.2017    source источник


Ответы (1)


Как и в C, вы должны инициализировать локаль. Это описано как в документации Python:

Начиная с версии 5.4, библиотека ncurses решает, как интерпретировать данные, отличные от ASCII, используя функция nl_langinfo. Это означает, что вы должны вызывать locale.setlocale() в приложении и кодировать строки Unicode, используя одну из доступных системных кодировок.

и справочная страница ncurses:

   The  library uses the locale which the calling program has
   initialized.  That is normally done with setlocale:

           setlocale(LC_ALL, "");

 If the locale is not initialized, the library  assumes  that
 characters are printable as in ISO-8859-1, to work with cer-
 tain legacy programs.  You should initialize the locale  and
 not  rely on specific details of the library when the locale
 has not been setup.

Отвечая на последующий комментарий, textpad.py не в любом случае ожидайте ввода UTF-8. По сути, он «проверяет» свой ввод, решает, что это не ASCII, и игнорирует его, если это не так.

привязка curses в Python предоставляет интерфейс для wgetch, который (с ncurses) дает отдельные байты для UTF-8. (X/Open Curses указывает другую функцию wget_wch, для которой Python не имеет привязки).

textpad.py можно изменить, чтобы обойти привязку curses, собрав байты в значение Unicode, но вам понадобится setlocale в качестве первого шага.

person Thomas Dickey    schedule 28.02.2017
comment
Я уже пробовал это, но это ничего не меняет, вышеупомянутые клавиши все еще не работают. - person lsgng; 02.03.2017