遇到 UnicodeEncodeError: ‘charmap’ codec can’t encode character 的问题解决

在 Windows 上运行 Python 脚本时,如果遇到 UnicodeEncodeError: 'charmap' codec can't encode character 的问题,这是因为 Windows 控制台默认使用 cp1252 编码,无法正确处理非 ASCII 字符(如中文)。你可以通过以下几种方式来解决这个问题:

  • 方法 1:在 Python 脚本中设置标准输出为 UTF-8
    在 Python 脚本中设置标准输出(stdout)和标准错误输出(stderr)为 UTF-8 编码,这样就可以正确打印中文字符了。你可以在脚本的开头添加以下代码:
python 复制代码
import sys
import io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8')
  • 方法 2:更改 Windows 控制台的编码为 UTF-8
    可以将 Windows 控制台的编码更改为 UTF-8,这样所有输出都会以 UTF-8 编码的方式进行处理。你可以在运行 Python 脚本之前执行以下命令:
batch 复制代码
chcp 65001

chcp 65001 将控制台的代码页设置为 UTF-8。你可以将这个命令写入一个批处理文件 (.bat),以便在运行 Python 脚本前自动设置编码。

  • 方法 3:使用 PYTHONIOENCODING 环境变量
    你也可以通过设置环境变量 PYTHONIOENCODING 来强制 Python 使用 UTF-8 编码。这样可以确保所有输出在默认情况下都使用 UTF-8 编码。你可以通过以下方式设置环境变量:

临时设置:

在命令行中运行以下命令来设置环境变量:

batch 复制代码
set PYTHONIOENCODING=utf-8

永久设置:

你可以通过 Windows 系统的环境变量设置,永久性地设置 PYTHONIOENCODING。

右键点击"此电脑"或"我的电脑",选择"属性"。

选择"高级系统设置"。

点击"环境变量"按钮。

在"系统变量"或"用户变量"下点击"新建",输入变量名 PYTHONIOENCODING,变量值 utf-8,然后保存。

  • 方法 4:使用 encode 和 decode 方法处理字符串
    在 Python 脚本中使用 encode 和 decode 方法处理字符串,确保字符串在输出前被正确编码:
python 复制代码
print("但是".encode('utf-8').decode('utf-8'))

这种方法确保字符串在输出前按照正确的编码进行处理,但通常不需要这样做,前面的方法更简单和直接。

示例

假设你有一个简单的 Python 脚本 test.py

python 复制代码
# test.py
print("你好,世界!")
在执行这个脚本之前,可以使用以下命令:
batch 复制代码
chcp 65001
python test.py

这样就可以正确地在控制台输出中文字符了。

要在Jenkins中调用Python脚本打印中文并避免UnicodeEncodeError,可以按照以下步骤在Windows上进行永久设置:

1. 更改系统区域设置为UTF-8

这是解决Python在Jenkins中输出中文乱码的最彻底的方法:

复制代码
打开控制面板:

转到时钟和区域 > 区域。
进入"管理"选项卡:

点击管理选项卡。
点击更改系统区域设置...。
启用UTF-8:

勾选Beta: 使用Unicode UTF-8提供全球语言支持。
重启计算机:

完成后,重新启动计算机以应用更改。
2. 为Jenkins设置环境变量

如果无法更改系统区域设置,可以专门为Jenkins设置环境变量:

打开Jenkins任务配置:

复制代码
进入你运行脚本的Jenkins任务配置页面。
添加环境变量:

在构建环境部分,添加一个新环境变量:
名称: PYTHONIOENCODING
值: utf-8
这样可以确保Python在通过Jenkins运行时使用UTF-8进行输入输出编码。
  1. 在Python脚本中设置编码
    在Python脚本的开头添加以下代码,以确保脚本在输出时使用UTF-8编码:
python 复制代码
import sys
import io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
4. 在Jenkinsfile中指定UTF-8编码

还可以通过在Jenkinsfile中明确指定Python使用UTF-8编码来执行脚本:

bash 复制代码
python -X utf8 your_script.py

这样可以强制Python在UTF-8模式下运行,确保正确处理中文字符。

总结

通过更改系统区域设置为UTF-8,或者为Jenkins设置环境变量,Python脚本在Jenkins中打印中文时不再出现UnicodeEncodeError。这将有效解决中文字符输出的问题。

相关推荐
Fluxproxy5 小时前
Python请求玄学根治:彻底解决脚本间歇性超时、断连、假死问题
网络·python·安全
青 春 记 忆5 小时前
零基础入门Python15|关联、聚合、索引与事务:订单数据库
开发语言·python·后端开发
qq_513728047 小时前
Alert 原生弹窗处理
python
李可以量化7 小时前
Redis 从了解到精通(三)上:量化交易场景下的数据备份与安全配置
redis·python·安全·qmt·ptrade
卷无止境7 小时前
FastAPI查询参数模型:把散落的参数收拢成一个整齐的盒子
后端·python
Code额7 小时前
Python asyncio 异步编程全套学习文档(零基础完整版)
python·学习·oracle·async·异步·asyncio
钱栈up7 小时前
Mac 开发机一键发版不用切环境:我这样改造了团队的后端部署脚本
运维·python·mac
BK贝壳8 小时前
Python底层:1亿个布尔值缓存失效标记,list爆内存numpy爆拷贝,bool-hybrid-array混合存储实测
数据结构·python·缓存·性能优化·list·numpy
coder_Eight8 小时前
从 3 天到 8 分钟:我如何把垂直科普内容做成了自动化流水线
python·ai编程