Python curses在CMD/PowerShell中显示ASCII文本异常的问题求助
问题分析
- CMD显示问号方块:CMD默认采用GBK编码,且终端字体对全角字符支持有限,导致UTF-8编码的全角空格、全角井号无法正确渲染。
- PowerShell开头截断:手动调用
os.system('cls')会干扰curses的终端初始化流程;readlines()读取的每行包含换行符,直接addstr会引发行位置偏移;加上未适配终端宽度,最终导致开头内容截断。
解决方案
1. 修复CMD字符显示问题
- 切换CMD编码为UTF-8:在脚本开头添加编码设置,或手动执行
chcp 65001将CMD编码切换为UTF-8。 - 替换全角字符为半角:把
logo.txt中的全角空格( )替换为半角空格( ),全角井号(#)替换为半角井号(#),确保CMD终端字体可识别。
2. 修复PowerShell截断问题
- 移除多余清屏命令:
curses.wrapper会自动完成终端初始化与清屏,无需手动调用os.system('cls'),避免终端状态混乱。 - 精确控制输出位置:使用
addstr(i, 0, line.rstrip('\n'))指定每行的起始行号和列号,同时移除换行符,防止自动换行引发位置偏移。 - 适配终端宽度:若每行长度超过终端宽度,可直接截断或居中显示,避免超出部分被截断。
优化后的代码
import curses def main(stdscr): stdscr.clear() # 设置curses编码为UTF-8,适配Windows终端 curses.set_encoding('utf-8') WIDTH = curses.COLS logo = [] with open("logo.txt", mode="r", encoding="utf-8") as dataFile: logo = dataFile.readlines() for i, line in enumerate(logo): # 移除换行符,避免自动换行干扰位置 line = line.rstrip('\n') # 适配终端宽度,过长则截断 if len(line) > WIDTH: line = line[:WIDTH] # 从第i行第0列开始输出 stdscr.addstr(i, 0, line) stdscr.refresh() stdscr.getkey() curses.wrapper(main)
额外注意事项
- 确保PowerShell和CMD的终端窗口宽度足够容纳logo的完整宽度,可手动拉大窗口后再运行脚本。
- 若问题仍存在,尝试更换终端字体为支持UTF-8的字体(如Consolas、微软雅黑)。
内容的提问来源于stack exchange,提问作者Lucy
相关产品推荐
相关产品推荐

