2017-02-28 66 views
1

我試圖使用curses textpad.Textbox()函數進行文本輸入。到目前爲止,一切正常,但是,某些鍵沒有被識別,包括部分符號(§)和所有德語變音符號(ä/ö/ü)。我想這是與文本編碼有關,但我不知道如何解決這個問題。我的德語鍵盤佈局與input()完美配合。Python詛咒 - textpad.Textbox()鍵盤輸入不與德國元音變音

下面是一些小例子:

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

正如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沒有綁定)。

textpad.py可以修改爲通過將字節組裝成Unicode值來解決curses綁定問題,但您需要將setlocale作爲第一步。

+0

我已經試過,但它不會改變任何東西,前述的鍵仍然不起作用。 – lysigk