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处理,把它转回正常的显示?