You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 07:58:12