You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

为何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,终端输出还是会乱码或显示问号。
  • 系统区域设置的坑: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

火山引擎 最新活动