解决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中文乱码问题的主要内容,如果未能解决你的问题,请参考以下文章

jenkins"控制台输出"乱码问题解决

Jenkins控制台中文输出乱码解决方法

jenkins 控制台输出中文乱码

log4j输出日志乱码(转)

解决jenkins控制台中文乱码问题

Jenkins 控制台输出中的奇怪字符