Python getch()返回错误的字符

Python getch()返回错误的字符,python,unicode,ascii,curses,getch,Python,Unicode,Ascii,Curses,Getch,我遇到了curses库的getch()函数的问题。 假设我们有以下程序: import curses def main(stdscr): while 1: c = stdscr.getch() stdscr.addstr(chr(c) + ": " + str(c) + "\n") curses.wrapper(main) 让我们运行它,并输入以下字符:a,,œ 那么输出是: a: 97 ć: 263 Å: 197 如您所见,a字符被正确地使用。 然

我遇到了
curses
库的
getch()
函数的问题。 假设我们有以下程序:

import curses

def main(stdscr):
    while 1:
        c = stdscr.getch()
        stdscr.addstr(chr(c) + ": " + str(c) + "\n")
curses.wrapper(main)
让我们运行它,并输入以下字符:
a
œ

那么输出是:

a: 97
ć: 263
Å: 197
如您所见,
a
字符被正确地使用。 然而,其他人并非如此。我只想得到backspace
'\b'
和unicode字符
œ
,但我们得到了其他东西

为什么
getch()
会有这种行为,我如何才能获得所需的行为

编辑:

我要强调的是,这不是打印字符的问题,而是阅读字符的问题。也就是说,在Python3.3中运行
stdscr.addstr('œ')
确实会打印
。它正确处理所有这些字符

如果您阅读了的文档,您会注意到它并不声称支持非ASCII可打印字符。它只是记录了它可以处理非ASCII按键,如功能键或键盘键

编辑:

使用
窗口时,获取wch
,字符(例如
'a'
'ă'
'好'
“\n”
“\t”
)作为字符串返回。功能键以整数形式返回(例如
265
274
)。下面是一个要运行的新示例。尝试使用要识别的不同键来查看它们的值是如何返回的。打印的数据格式为:
[repr]:[type]

def main(stdscr):
    while 1:
        c = stdscr.get_wch()
        stdscr.addstr("%s: %s\n" % (repr(c), type(c)))
以下是我键入
a
œ
时得到的信息:

在Python3.3中添加了该函数。它正确处理所有这些字符

如果您阅读了的文档,您会注意到它并不声称支持非ASCII可打印字符。它只是记录了它可以处理非ASCII按键,如功能键或键盘键

编辑:

使用
窗口时,获取wch
,字符(例如
'a'
'ă'
'好'
“\n”
“\t”
)作为字符串返回。功能键以整数形式返回(例如
265
274
)。下面是一个要运行的新示例。尝试使用要识别的不同键来查看它们的值是如何返回的。打印的数据格式为:
[repr]:[type]

def main(stdscr):
    while 1:
        c = stdscr.get_wch()
        stdscr.addstr("%s: %s\n" % (repr(c), type(c)))
以下是我键入
a
œ
时得到的信息:



哪个版本的Python?版本是Python 3.3看起来编码之间的交互很糟糕-您的特定于语言环境的变量设置为什么,您在Python代码中是否进行了特定于语言环境的设置?我没有进行任何编码设置。运行
locale.getpreferredencoding()
会给出
'UTF-8'
。您是否遵循了说明?哪一版本的Python?该版本是Python 3.3,看起来编码之间的交互不好-您的特定于语言环境的变量设置为什么?您的Python代码中是否进行了特定于语言环境的设置?我没有进行任何编码设置。运行
locale.getPreferredEncode()
会给出
'UTF-8'
。您是否遵循了中的说明?这确实适用于
,但
(和
,等等)字符仍然被错误对待。我在答案中添加了有关返回值的信息。对我来说,键入
时,您的脚本将返回
'\n':
330:
265:
。因此,
仍然被错误地对待,但它显然对您有效。您在键入
时得到了
330
curses.keyname(330)
返回
'KEY\u DC'
。退格/删除在不同计算机上的工作方式不同。我正在运行Mac OS X,其中我的“Backspace”(上面写着“Delete”)返回
'\x7f'
——用于删除的ASCII值。您的“Delete”键返回了
330
,它对应于键名
“key\u DC”
键\u DC
为常数。当你按下
,你会得到什么?这确实适用于
œ
,但是
(和
,…等)字符仍然被错误地对待。我在答案中添加了关于返回值的信息。对我来说,你的脚本返回
'\n':
330:
265:
在键入
时。因此,
仍然被错误地对待,但它显然对您有效。您在键入
时得到了
330
curses.keyname(330)
返回
'KEY\u DC'
。退格/删除在不同计算机上的工作方式不同。我正在运行Mac OS X,其中我的“Backspace”(上面写着“Delete”)返回
'\x7f'
——用于删除的ASCII值。您的“Delete”键返回了
330
,它对应于键名
“key\u DC”
键\u DC
为常数。按
时会得到什么?
>>> curses.keyname(265)
b'KEY_F(1)'