2014-03-03 48 views
2

我遇到getch()函數的curses函數庫存在問題。 假設我們有以下程序:getch()返回錯誤字符

import curses 

def main(stdscr): 
    while 1: 
     c = stdscr.getch() 
     stdscr.addstr(chr(c) + ": " + str(c) + "\n") 
curses.wrapper(main) 

讓我們來運行它,並輸入以下文字:a<backspace>œ

然後輸出爲:

a: 97 
ć: 263 
Å: 197 

正如你看到的, a字符采取正確。 但是,其他人不是。我只想獲得退格'\b'和Unicode字符œ,但我們得到了別的東西。

爲什麼getch()表現這種方式,我如何得到所需的行爲?

編輯:

我要強調這是不打印字符的問題,但隨着閱讀的字符。即運行stdscr.addstr('œ')確實打印œ

+0

哪個版本的Python? – hivert

+0

版本是python 3.3 –

+0

看起來像編碼之間的不良交互 - 您的特定於語言環境的變量設置爲什麼,並且您是否在Python代碼中執行任何特定於語言環境的設置? – twalberg

回答

4

在Python 3.3中添加了window.get_wch函數。它正確處理所有這些字符。

如果您閱讀window.getch的文檔,您會注意到它並不聲稱支持非ASCII可打印字符。它只是記錄它可以處理非ASCII按鍵,如功能鍵或小鍵盤按鍵。

編輯:

當使用window.get_wch,字符(例如'a''ă''好''\n',或'\t')返回爲字符串。功能鍵作爲整數返回(例如265274)。這是一個運行的新例子。嘗試使用您想要識別的不同密鑰進行遊戲,看看它們的值是如何返回的。打印的數據格式爲:[repr]: [type]

def main(stdscr): 
    while 1: 
     c = stdscr.get_wch() 
     stdscr.addstr("%s: %s\n" % (repr(c), type(c))) 

這裏是我所得到的,當我輸入aœ<enter><backspace><F1>

'a': <class 'str'> 
'œ': <class 'str'> 
'\n': <class 'str'> 
'\x7f': <class 'str'> 
265: <class 'int'> 

如果返回一個整數,你可以找出按下的鍵名通過curses.keyname

>>> curses.keyname(265) 
b'KEY_F(1)' 
+0

這確實適用於'œ',但''(和「」,「」,「」等等)字符仍然被錯誤地處理。 –

+0

我添加了有關返回值的答案的信息。 – tsroten

+0

對我來說,你的腳本返回' '\ n' 的',' 330:'和' 265:輸入'',''和''時'。所以''仍然被錯誤地處理,而它顯然適用於你。 –