为何Windows cmd与PowerShell启用UTF-8仍无法正确显示波斯字符?
解决Windows终端(cmd/PowerShell)波斯字符显示与Python程序兼容问题
一、为什么启用UTF-8后仍无法正确显示波斯字符?
这其实是终端编码设置+字体支持的双重问题,光改编码还不够:
- 字体限制:默认的终端字体(比如Consolas、Lucida Console)根本不支持波斯文这类非拉丁字符。即使编码设对了,字体没对应的字形,就只能显示
?。 - 编码配置不完整:
- 在cmd里,仅执行
chcp 65001只是切换了代码页,但终端的输入/输出编码可能没完全同步到UTF-8; - 在PowerShell中,除了代码页,还要确保
$OutputEncoding和[Console]::OutputEncoding也设置为UTF-8,不然即使系统区域设为UTF-8,终端输出还是会乱码或显示问号。
- 在cmd里,仅执行
- 系统区域设置的坑:Windows 10+虽然有「Beta版:使用Unicode UTF-8提供全球语言支持」的选项,但开启后可能导致部分老程序兼容问题,而且不是所有终端都会自动继承这个设置。
二、Python程序执行chcp 65001后报错的解决办法
当你切换到UTF-8代码页后,Python的标准输出编码和终端的编码出现了不匹配,导致抛出异常。可以按以下步骤修复:
1. 先确保终端环境配置正确
- cmd环境:
执行chcp 65001后,还要设置支持波斯文的字体,比如「B Nazanin」或「Vazirmatn」(需要先安装这类字体),然后右键cmd窗口标题 → 属性 → 字体,选择对应的波斯字体。 - PowerShell环境:
除了执行chcp 65001,还要在PowerShell中运行这两行命令,强制输出编码为UTF-8:$OutputEncoding = [System.Text.UTF8Encoding]::new() [Console]::OutputEncoding = [System.Text.UTF8Encoding]::new()
2. 修改Python程序的编码配置
在Python代码开头添加以下代码,强制标准输出使用UTF-8编码,避免和终端编码冲突:
import sys import io # 强制标准输出为UTF-8 sys.stdout = io.TextIOWrapper(sys.stdout.detach(), encoding='utf-8') sys.stderr = io.TextIOWrapper(sys.stderr.detach(), encoding='utf-8')
或者,在运行Python脚本时,指定环境变量:
set PYTHONUTF8=1 python your_script.py
这个环境变量会让Python默认使用UTF-8处理标准输入输出,无需修改代码。
3. 测试波斯字符显示
修改后,再运行你的文件夹遍历程序,应该就能正确显示波斯文名称了。如果还是有问题,检查一下:
- 文件夹的实际编码是否为UTF-8(Windows下NTFS文件系统默认是Unicode,所以一般没问题);
- 终端字体是否真的支持波斯文(可以用字符映射表测试字体是否包含波斯字形)。
内容的提问来源于stack exchange,提问作者M.H Mighani




