需求
项目需要,我采用jenkins + python + vs2017来实现自动打包的流程,之前都是用现成的,这一次是自己实践,搭建过程就省略了,教程太多,jenkins控制台的乱码问题,倒是让我比较困扰,所以记录一下。
问题现象
jenkins中开始打包任务之后,发现在vs2017编译之后输出的日志中,中文部分都是乱码。
无效解决
- 在网上发现一个方式,在系统设置的语言设置中,将当前系统的编码选择为beta版Unicode编码,重启系统,启动jenkins,可以看到中文确实展示正常,但是,此时我们的代码中各种错误,是因为之前都是使用gbk编码,现在整个系统都变成了Unicode编码,所以报错,一般的大工程中,去修改代码是不现实的,所以这个方法pass
- 又发现一个比较古老的方式,在系统环境变量中设置JAVA_TOOL_OPTIONS路径,配置上utf-8,然后在jenkins的系统设置,在全局属性添加LANG和utf-8的键值对,这个方法也不起作用,java使用的Unicode编码,现在jenkins基本和java保持抑制了
- 以及还有在python中头部添加“coding=utf-8”这种方法,也不起作用。现在的python3.x之后,默认都是utf-8的编码
- 还看到一个方法,就是在终端里面使用chcp 65001来设置,但是我尝试发现,这个也不起作用
思考
后来我又尝试了另一种方案,我把输出的日志内容写到文件中,发现其编码是gbk,所以我将这个日志内容转换成了utf-8,但是输出的中文还是乱码。
然后结合上面第一个解决方案,发现关键就在于windows控制台输出编码和utf-8的冲突,所以还是要从系统控制台编码上入手,才应该可能解决。
最终解决
最终我发现了一个帖子,从里面找到了一下几个东西:
sys.getdefaultencoding() #系统编码 ===> utf-8
sys.getfilesystemencoding() #文件编码 ===> utf-8
sys.stdin.encoding #控制台输入流编码 ===> gbk
sys.stdout.encoding #控制台输出流编码 ===> gbk
sys.stderr.encoding #控制台错误流编码 ===> gbk
所以现在,就知道了乱码的根源,无论我们的日志是什么编码,都将按照gbk来输出,然后jenkins这边会以utf-8来解析,所以乱码出现了,紧接着就找到了python中专门设置编码的方法,如下:
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8')
我的场景中需要用的就这两个,所以将这两个流的编码设置为utf-8,再次实验,完美解决乱码问题。文章来源:https://www.toymoban.com/news/detail-619781.html
参考
主要感谢下面这个文章的大神
修改控制台输入输出以及错误流的编码提示文章来源地址https://www.toymoban.com/news/detail-619781.html
到了这里,关于jenkins在windows上中文乱码问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!