使用subprocess.run执行含重音字符命令时的UTF-8编码异常问题求助
问题本质原因
你碰到的问题核心在于Windows的cmd.exe默认用的是OEM编码(不是UTF-8),所以subprocess.run拿到的输出字节是该编码下的结果,和你预期的UTF-8格式完全不一样。
具体来说,0x82是美式英语Windows默认OEM编码cp437里对应é的字节值,而你手动编码得到的c3a9是UTF-8标准下的é。这就是为啥用UTF-8解码会报错——字节本身就不是UTF-8格式的呀。
解决办法
给你几个实用的解决方案,按推荐程度排序:
1. 用系统OEM编码解码输出
Windows的OEM编码可以通过sys.getfilesystemencoding()自动获取,你可以直接在subprocess.run里指定这个编码,或者拿到字节后手动解码:
方式一:直接在subprocess中指定编码
# -*- coding: utf-8 -*- import subprocess import sys cmd = "echo é" # 获取系统默认的OEM编码 oem_encoding = sys.getfilesystemencoding() result = subprocess.run(cmd, shell=True, stdout=subprocess.PIPE, encoding=oem_encoding) print("输出结果:", result.stdout.strip()) # 正常显示é
方式二:手动解码原始字节
如果已经拿到了未解码的字节流,也可以这么处理:
output = result.stdout.decode(sys.getfilesystemencoding()).strip()
2. 让cmd先切换到UTF-8再执行命令
你可以在执行目标命令前,先通过chcp 65001把控制台编码改成UTF-8,这样输出就会是UTF-8格式的字节了:
# -*- coding: utf-8 -*- import subprocess # 先切换编码到UTF-8(>nul屏蔽chcp的输出),再执行echo命令 cmd = "chcp 65001 >nul && echo é" result = subprocess.run(cmd, shell=True, stdout=subprocess.PIPE, encoding="utf-8") print("输出结果:", result.stdout.strip())
3. 改用PowerShell执行(最推荐)
PowerShell对UTF-8的支持比cmd友好得多,默认就能返回符合预期的UTF-8输出,你只需要指定用PowerShell作为执行环境就行:
# -*- coding: utf-8 -*- import subprocess cmd = "echo é" # 指定用PowerShell执行命令 result = subprocess.run(cmd, shell=True, stdout=subprocess.PIPE, encoding="utf-8", executable="powershell.exe") print("输出结果:", result.stdout.strip())
这种方式不需要额外处理编码,一步到位解决问题。
内容的提问来源于stack exchange,提问作者PaulM
相关产品推荐
相关产品推荐

