2017-02-28 11 views
1

私はcurses textpad.Textbox()関数をテキスト入力に使用しようとしています。これまでのところすべてうまくいっていますが、セクション記号(§)とすべてのドイツ語ウムラウト(ä/ö/ü)を含むいくつかのキーは認識されません。私はそれが何とかテキストエンコーディングに関連していると思いますが、私はこれをどのように修正するか考えていません。ドイツ語のキーボードレイアウトはinput()で完璧に動作します。ここでPython curses - textpad.Textbox()キーボード入力がドイツ語のウムラウトで動作しない

は、いくつかの最低限の例です:ちょうどCのように

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

、あなたはロケールを初期化する必要があります。これは、両方のPython documentationで綴られます:

version 5.4ので、ncursesライブラリはにnl_langinfo関数を使用して、非ASCIIデータをどのように解釈するかを決定します。つまり、アプリケーションでlocale.setlocale()を呼び出して、システムの使用可能なエンコーディングの1つを使用して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はUTF-8のための個々のバイトを与える(のncurses有する)、wgetchへのインタフェースを提供します。 (X/Open Cursesは別の関数wget_wchを指定していますが、Pythonにはバインディングがありません)。

textpad.pyは、バイトをUnicode値にアセンブルすることでcursesバインディングを回避するように変更できますが、最初のステップとしてsetlocaleが必要です。

+0

私はすでにそれを試みましたが、何も変わらない、前述のキーはまだ動作しません。 – lysigk

関連する問題