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)'