解决jenkins输出log中文乱码问题
Posted zcube
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解决jenkins输出log中文乱码问题相关的知识,希望对你有一定的参考价值。
描述:jenkins之前log中文是可以正常显示的,但是将git的log改为utf-8修复好后,jenkins输出的log中文就变成乱码了,虽然使用chcp 65001 可以解决系统输出中文正常,但是nsis打包程序输出的信息依然是乱码。git的log中文乱码问题:http://blog.csdn.net/zcube/article/details/50012107
解决思路:
写一个ansi转utf-8的程序,如果项目运行完后执行该程序,将log转为utf-8格式编码。
需要解决的问题:
1、获得当前构建项目的路径,并将其写入到一个公共的文件。
2、从公共文件读取log路径,将log转为utf-8编码。
解决方案:
1、打开项目配置页,增加构建步骤-Execute Windows batch command,添加如下命令:
chcp 936 & "D:\\.jenkins\\ANSI2UTF-8\\WritePath.exe" "%JENKINS_HOME%\\jobs\\%JOB_NAME%\\builds\\%BUILD_NUMBER%\\log"
2、增加构建后操作步骤-Build other projects,添加 Ansi2Utf8,选择 Trigger even if the build fails。
3、新建一个自由风格项目,Item名称:Ansi2Utf8,增加构建步骤-Execute Windows batch command,添加如下命令:
D:\\.jenkins\\ANSI2UTF-8\\Ansi2Utf8.exe
4、将WritePath.exe和Ansi2Utf8.exe放在D:\\.jenkins\\ANSI2UTF-8\\目录下。
5、D:\\.jenkins是我的jenkins所在目录,WritePath.exe和Ansi2Utf8.exe的源码在下面。
WritePath源码:
// WritePath.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <fstream>
using namespace std;
int main(int argc, char *argv[])
ofstream outfile;
outfile.open("C:\\\\tmp_build_path", ios::out | ios::trunc);
if (argc > 1)
outfile << argv[1];
outfile.close();
return 0;
Ansi2Utf8源码:
// Ansi2Utf8.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <fstream>
#include <iostream>
#include <string>
#include <sstream>
#include <windows.h>
using namespace std;
std::string Asci2Utf8(std::string const& s)
_ASSERT(strlen(s.c_str()) == s.length());
//int BufferLen = (int)(s.length()*2+10);
//uint8* Buffer = new uint8[BufferLen];
wchar_t* Buffer = new wchar_t[s.length() + 1];
memset(Buffer, 0, (s.length() + 1) * 2);
// to unicode
int UnicodeLen = MultiByteToWideChar(
CP_ACP,
0,
s.c_str(),
(int)s.length(),
Buffer,
(int)(s.length() + 1));
_ASSERT(UnicodeLen);
int OutBufferLen = int((s.length() + 1) * 3); // NOTE: utf8 maybe 3 bytes
char* OutBuffer = new char[OutBufferLen];
memset(OutBuffer, 0, OutBufferLen);
// to utf8
int Utf8Len = WideCharToMultiByte(
CP_UTF8,
0,
Buffer,
UnicodeLen,
OutBuffer,
OutBufferLen,
NULL,
NULL);
_ASSERT(Utf8Len);
std::string Ret = std::string(OutBuffer, Utf8Len);
delete[]Buffer;
delete[]OutBuffer;
_ASSERT(strlen(Ret.c_str()) == Ret.length());
return Ret;
string slurp(ifstream& in)
stringstream sstr;
sstr << in.rdbuf();
return sstr.str();
int main()
ifstream infile;
infile.open("C:\\\\tmp_build_path");
string strPath = slurp(infile);
infile.close();
infile.open(strPath);
string logdata = slurp(infile);
infile.close();
ofstream outfile;
outfile.open(strPath, ios::out | ios::trunc);
outfile << Asci2Utf8(logdata);
outfile.close();
outfile.open("C:\\\\tmp_build_path", ios::out | ios::trunc);
outfile.close();
return 0;
这样的问题:
运行过程中输出log依然是乱码,但是项目构建完后再去看就正常了。
以上是关于解决jenkins输出log中文乱码问题的主要内容,如果未能解决你的问题,请参考以下文章