CreateProcess怎么设置输出的编码格式

C#的ProcessStartInfo可以设置StandardOutputEncoding为Encoding.UTF8来实现。类似的在c++里的CreateProcess怎么设置utf-8,来实现接受输出?

代码等详细描述看第一个回答里

跪求大神!!!!


#include <Windows.h>

int main()
{
	STARTUPINFO si;
	ZeroMemory(&si, sizeof(STARTUPINFO));
	si.cb = sizeof(STARTUPINFO);
	si.dwFlags |= STARTF_USESHOWWINDOW;
	si.wShowWindow = SW_HIDE;

	SECURITY_ATTRIBUTES sa;
	ZeroMemory(&sa, sizeof(SECURITY_ATTRIBUTES));
	sa.nLength = sizeof(SECURITY_ATTRIBUTES);
	sa.bInheritHandle = TRUE;
	sa.lpSecurityDescriptor = nullptr;

	HANDLE stdOutWrite = INVALID_HANDLE_VALUE;
	void* m_StdOutRead = INVALID_HANDLE_VALUE;
	CreatePipe(&m_StdOutRead, &stdOutWrite, &sa, 1024 * 1024);
	SetHandleInformation(m_StdOutRead, HANDLE_FLAG_INHERIT, 0);
	si.hStdOutput = stdOutWrite;
	si.dwFlags |= STARTF_USESTDHANDLES;

	char szArg[1024];
	strcpy_s(szArg, 1024, "D:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\VC\\Tools\\MSVC\\14.28.29910\\bin\\Hostx64\\x64\\cl.exe \"D:\\process\\chinese.cpp\" /E");
	PROCESS_INFORMATION info;
	ZeroMemory(&info, sizeof(PROCESS_INFORMATION));
	CreateProcess(nullptr, szArg, nullptr, nullptr, TRUE, 0, nullptr, nullptr, &si, &info);

	CloseHandle(si.hStdOutput);

	DWORD bytesAvail = 0;
	PeekNamedPipe(m_StdOutRead, nullptr, 0, nullptr, (LPDWORD)&bytesAvail, nullptr);
	DWORD bytesReadNow = 0;
	char* szBuffer = new char[bytesAvail];
	ReadFile(m_StdOutRead, szBuffer, bytesAvail, (LPDWORD)&bytesReadNow, nullptr);

	delete[]szBuffer;
	return 0;
}

 

这里是C#代码

using System;
using System.Diagnostics;
using System.Text;
using System.IO;
using System.Collections.Generic;

namespace process2
{
    class Program
    {
        static void Main(string[] args)
        {
            ProcessStartInfo startInfo = new ProcessStartInfo(
                "D:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\VC\\Tools\\MSVC\\14.28.29910\\bin\\Hostx64\\x64\\cl.exe",
                "\"D:\\process\\chinese.cpp\" /E");
            startInfo.UseShellExecute = false;
            startInfo.RedirectStandardInput = true;
            startInfo.RedirectStandardOutput = true;
            startInfo.StandardOutputEncoding = Encoding.UTF8;

            Process process = new Process();
            process.StartInfo = startInfo;
            process.Start();
            string strOutput = process.StandardOutput.ReadToEnd();
            process.WaitForExit();
            process.Close();
        }
    }
}

cl.exe用/E预编译chinese.cpp(以UTF-8保存的源文件)

int func()
{
    const char* sz = "我的是中文!";
    return 0;
}

c#里由于加了startInfo.StandardOutputEncoding = Encoding.UTF8;

string strOutput里的结果为

#line 1 "D:\\process\\chinese.cpp"
int func()
{
    const char* sz = "我的是中文!";
    return 0;
}

不加Encoding.UTF8的话就是

#line 1 "D:\\process\\chinese.cpp"
int func()
{
    const char* sz = "鎴戠殑鏄腑鏂囷紒";
    return 0;
}

c++的代码,szBuffer就是跟C#不加Encoding.UTF8一样显示乱码。

所以问题是C++里要怎么处理?

或者如何直接对szBuffer处理,把它转回正常的显示?