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

PowerShell调用Python脚本传递非ASCII字符时编码异常

问题背景

Windows 10 + PowerShell 5.1 环境下,现有 Python 脚本 printargs.py:

#! /usr/bin/python3
import sys
for arg in sys.argv:
    print(arg)

通过批处理文件 runme.bat 调用可正常输出 UTF-8 字符 ä,但用 PowerShell 脚本 runme.ps1 调用时,ä 会被解析为乱码 ä,且尝试设置编码变量无效。


解决方案1:设置Python UTF-8环境变量(推荐)

此方法无需修改控制台全局编码,仅针对Python生效:

  1. 确保 runme.ps1 脚本文件保存为 UTF-8带BOM 编码(PowerShell 5.1默认仅识别带BOM的UTF-8脚本)。
  2. 在脚本中添加环境变量配置后调用Python:
# 让Python强制用UTF-8处理命令行参数与IO
$env:PYTHONUTF8 = 1
& py printargs.py ä

解决方案2:统一控制台与PowerShell编码

若不想依赖Python环境变量,可同步控制台与PowerShell的编码设置:

  1. 同样确保 runme.ps1 为 UTF-8带BOM 编码。
  2. 在脚本开头添加编码配置:
# 切换控制台代码页为UTF-8,抑制chcp的输出提示
chcp 65001 | Out-Null
# 同步PowerShell与外部程序交互的编码为带BOM的UTF-8
$OutputEncoding = [console]::InputEncoding = [console]::OutputEncoding = [System.Text.Encoding]::UTF8
# 调用Python脚本
& py printargs.py ä

无效原因说明

你之前使用的 New-Object System.Text.UTF8Encoding 创建的是无BOM的UTF-8编码对象,而Windows控制台的UTF-8代码页(65001)实际兼容带BOM的处理逻辑,因此无法匹配。同时,PowerShell 5.1对无BOM的UTF-8脚本支持不佳,脚本本身编码错误会导致参数在传递阶段就已乱码,这也是核心问题之一。

内容的提问来源于stack exchange,提问作者17tmh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 22:35:18