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生效:
- 确保
runme.ps1脚本文件保存为 UTF-8带BOM 编码(PowerShell 5.1默认仅识别带BOM的UTF-8脚本)。 - 在脚本中添加环境变量配置后调用Python:
# 让Python强制用UTF-8处理命令行参数与IO $env:PYTHONUTF8 = 1 & py printargs.py ä
解决方案2:统一控制台与PowerShell编码
若不想依赖Python环境变量,可同步控制台与PowerShell的编码设置:
- 同样确保
runme.ps1为 UTF-8带BOM 编码。 - 在脚本开头添加编码配置:
# 切换控制台代码页为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
相关产品推荐
相关产品推荐

