Python Curses中getkey()无法正确显示输入字符的问题求助
解决Windows下curses处理特殊字符显示异常及空字符报错问题
问题根源
Windows CMD默认编码与windows-curses的字符处理逻辑存在适配问题:
stdscr.keypad(True)会干扰普通Unicode字符的解析,它主要用于方向键、功能键等特殊按键的识别getkey()在处理土耳其语ı、德语ü这类宽字符时,可能返回包含空字符的异常字符串,触发ValueError- 未显式指定curses编码,导致多字节字符显示乱码
修复后的代码
import curses def main(stdscr): # 关闭keypad模式,避免干扰普通字符读取 stdscr.keypad(False) # 强制curses使用UTF-8编码,匹配终端编码 curses.set_encoding("utf-8") while True: # 使用get_wch()读取宽字符,原生支持Unicode ch = stdscr.get_wch() # 兼容不同终端的回车触发方式 if ch in ('\n', '\r', curses.KEY_ENTER, curses.KEY_RETURN): break # 清空当前行再输出,避免残留字符干扰显示 stdscr.move(0, 0) stdscr.clrtoeol() stdscr.addstr(0, 0, ch) stdscr.refresh() curses.wrapper(main)
关键修复点说明
- 关闭keypad模式:仅在需要处理方向键、功能键时开启该模式,普通字符输入场景下关闭可避免字符解析异常
- 使用
get_wch():专门用于读取宽字符,原生支持Unicode,不会像getkey()那样返回含空字符的异常结果 - 设置UTF-8编码:通过
curses.set_encoding("utf-8")统一编码逻辑,需配合终端编码设置 - 清空行后输出:每次输入后清空当前行,避免之前的字符残留导致显示混乱
终端环境配置
运行代码前,先在CMD中执行以下命令切换到UTF-8编码:
chcp 65001
内容的提问来源于stack exchange,提问作者Tarık Can KARADENİZ
相关产品推荐
相关产品推荐

