遇到 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。这将有效解决中文字符输出的问题。

相关推荐
Tomorrow'sThinker2 分钟前
✍️ Python 批量设置 Word 文档多级字体样式(标题/正文/名称/小节)
python·自动化·word·excel
秋难降22 分钟前
Python 知识点详解(三)
python·编程语言
chao_7891 小时前
二分查找篇——寻找旋转排序数组中的最小值【LeetCode】
python·线性代数·算法·leetcode·矩阵
金玉满堂@bj1 小时前
PyCharm 中 Python 解释器的添加选项及作用
ide·python·pycharm
程序员三藏1 小时前
如何使用Pytest进行测试?
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·pytest
随心点儿2 小时前
使用python 将多个docx文件合并为一个word
开发语言·python·多个word合并为一个
不学无术の码农2 小时前
《Effective Python》第十三章 测试与调试——使用 Mock 测试具有复杂依赖的代码
开发语言·python
sleepybear11132 小时前
在Ubuntu上从零开始编译并运行Home Assistant源码并集成HACS与小米开源的Ha Xiaomi Home
python·智能家居·小米·home assistant·米家·ha xiaomi home
纪伊路上盛名在2 小时前
(鱼书)深度学习入门1:python入门
人工智能·python·深度学习
夏末蝉未鸣013 小时前
python transformers笔记(TrainingArguments类)
python·自然语言处理·transformer