Windows PowerShell中Python print遇|或>触发编码错误的问题求助
中文Windows PowerShell中Python输出重定向Unicode编码问题解决
问题场景
在中文Windows系统的PowerShell环境下,执行以下Python脚本test.py:
# -*- coding: utf-8 -*- print("Er, Süleyman")
直接运行python test.py时能正常输出Er, Süleyman,但执行重定向命令python test.py > tmp.txt,或者管道输出到Out-File(python test.py | Out-File -Encoding utf8 tmp.txt)时,会触发UnicodeEncodeError,提示'gbk'编码无法转义字符'\u0308'。通过locale.getpreferredencoding()获取到系统默认编码为cp936(即GBK)。
尝试过的方法
尝试直接写入stdout缓冲区绕开默认编码处理,修改脚本为:
# -*- coding: utf-8 -*- import sys sys.stdout.buffer.write("Er, Süleyman".encode('utf-8'))
执行后虽无报错,但输出到文件的内容显示乱码:Er, Su虉leyman。
解决方案
在PowerShell 5.1及以上版本中,执行以下命令修改Out-File的默认编码为UTF-8:
$PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'
设置后再执行重定向或管道输出命令,即可正常生成UTF-8编码的文件,内容显示正确。
核心原因
问题的本质是Python标准输出、Windows系统、PowerShell三者的默认编码不匹配:
- Python在终端直接输出时,会自动适配终端的GBK编码,所以能正常显示带特殊字符的内容;
- 当输出被重定向或管道传输时,Python会切换为使用系统默认编码(CP936)处理输出,而特殊字符
ü(由u和组合字符\u0308组成)无法被GBK编码; - PowerShell的
Out-File默认编码并非UTF-8,即使手动指定-Encoding utf8,也会和Python端的编码处理产生冲突,导致乱码或报错。
内容的提问来源于stack exchange,提问作者link89
相关产品推荐
相关产品推荐

