我无法让它工作,所以我从 CreateProcess()
获取 UTF-8 输出到 wstring
。
目前我正在运行此方法来执行此操作但没有 UTF-8 输出:
HANDLE g_hChildStd_OUT_Rd = NULL;
HANDLE g_hChildStd_OUT_Wr = NULL;
HANDLE g_hChildStd_ERR_Rd = NULL;
HANDLE g_hChildStd_ERR_Wr = NULL;
PROCESS_INFORMATION CreateChildProcess(void);
void ReadFromPipe(PROCESS_INFORMATION);
string run(char *command){
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle = TRUE;
sa.lpSecurityDescriptor = NULL;
if ( ! CreatePipe(&g_hChildStd_ERR_Rd, &g_hChildStd_ERR_Wr, &sa, 0) ) {
exit(1);
}
if ( ! SetHandleInformation(g_hChildStd_ERR_Rd, HANDLE_FLAG_INHERIT, 0) ){
exit(1);
}
if ( ! CreatePipe(&g_hChildStd_OUT_Rd, &g_hChildStd_OUT_Wr, &sa, 0) ) {
exit(1);
}
if ( ! SetHandleInformation(g_hChildStd_OUT_Rd, HANDLE_FLAG_INHERIT, 0) ){
exit(1);
}
char *szCmdline=command;
PROCESS_INFORMATION piProcInfo;
STARTUPINFO siStartInfo;
bool bSuccess = FALSE;
ZeroMemory( &piProcInfo, sizeof(PROCESS_INFORMATION) );
ZeroMemory( &siStartInfo, sizeof(STARTUPINFO) );
siStartInfo.cb = sizeof(STARTUPINFO);
siStartInfo.hStdError = g_hChildStd_ERR_Wr;
siStartInfo.hStdOutput = g_hChildStd_OUT_Wr;
siStartInfo.dwFlags |= STARTF_USESTDHANDLES;
bSuccess = CreateProcess(NULL,
szCmdline, // command line
NULL, // process security attributes
NULL, // primary thread security attributes
TRUE, // handles are inherited
CREATE_NO_WINDOW, // creation flags
NULL, // use parent's environment
NULL, // use parent's current directory
&siStartInfo, // STARTUPINFO pointer
&piProcInfo); // receives PROCESS_INFORMATION
CloseHandle(g_hChildStd_ERR_Wr);
CloseHandle(g_hChildStd_OUT_Wr);
if ( ! bSuccess ) {
exit(1);
}
DWORD dwRead;
CHAR chBuf[BUFSIZE];
bool bSuccess2 = FALSE;
std::string out = "", err = "";
for (;;) {
bSuccess2=ReadFile( g_hChildStd_OUT_Rd, chBuf, BUFSIZE, &dwRead, NULL);
if( ! bSuccess2 || dwRead == 0 ) break;
std::string s(chBuf, dwRead);
out += s;
}
dwRead = 0;
for (;;) {
bSuccess2=ReadFile( g_hChildStd_ERR_Rd, chBuf, BUFSIZE, &dwRead, NULL);
if( ! bSuccess2 || dwRead == 0 ) break;
std::string s(chBuf, dwRead);
err += s;
}
return out;
}
我尝试了几件事,但没有成功。
感谢任何帮助!
最佳答案
命令的输出是一个字节流。所以你把它当作一个字节流来读。两个程序就使用的编码达成一致。
例如:
如果您执行 .NET (C#/VB.NET) 控制台应用程序,该应用程序可以使用
Console.OutputEncoding
, 设置编码Console.Write[Line]
method会用。Console.OutputEncoding = Text.Encoding.UTF8;
同样,PowerShell 脚本可以使用
[Console]::OutputEncoding
,将编码设置为Write-Output
。或Write-Host
cmdlet 将使用。[Console]::OutputEncoding = [Text.Encoding]::UTF8
cmd.exe
或批处理文件可以使用chcp
command .chcp 65001
Win32 应用程序可以使用
SetConsoleOutputCP
function设置它的输出编码,如果它使用WriteConsole
.如果应用程序使用WriteFile
,它只需要写入已经按需要编码的字节(例如使用WideCharToMultiByte
)。SetConsoleOutputCP(CP_UTF8);
然后当您读取应用程序输出时,您使用约定的编码对字节流进行解码。例如。使用 MultiByteToWideChar
function .
关于C++ 从 CreateProcess() 获取 UTF-8 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39007332/