Python curses - textpad.Textbox()键盘输入无法使用德语变音符号

时间:2017-02-28 13:54:00

标签: python encoding ncurses curses python-curses

我正在尝试使用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()

1 个答案:

答案 0 :(得分:2)

就像在C中一样,您应该初始化语言环境。它在Python documentation

中都有详细说明
  

version 5.4开始,ncurses库决定如何使用nl_langinfo函数解释非ASCII数据。这意味着您必须在应用程序中调用locale.setlocale()并使用系统的可用编码之一编码Unicode字符串。

ncurses manual page

   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而忽略它不是。

Python的curses binding提供了wgetch的接口,其中(带有 ncurses )为UTF-8提供了单独的字节。 (X / Open Curses指定了一个不同的函数wget_wch,Python没有绑定)。

可以通过将字节组合成Unicode值来修改

textpad.py以解决curses绑定问题,但是您需要setlocale作为第一步。