我有一个应用程序,用户可以从Linux机器写入Windows shell,然后接收输出。但是当用户试图访问包含重音字符的目录(例如“TÉST_DIR”“ÇOME_DIR”)时,它不能,我找到它来读取重音字符的唯一方法是将用户的消息转换为wstring,但是我有问题通过WriteFile将此转换传递给管道输入,由于某种原因它不起作用,我可能做错了。
我发现的另一种方法是将linux端口的字符编码放到cp-1252,并在Windows端使用SetConsoleCP / SetConsoleOutputCP和相同的编码,但是这是一个我不想使用的解决方案,因为该应用程序在未来应该保持多平台。
下面是我用来接收客户端消息并写入管道输入的函数,以及将字符串转换为wstring的函数。
我的问题的任何解决方案?
/*---------------------------------------------------------------------*/
/*--- s2ws - Convert string to wstring ---*/
/*---------------------------------------------------------------------*/
std::wstring Gear::s2ws(const std::string& str)
{
using convert_typeX = std::codecvt_utf8<wchar_t>;
std::wstring_convert<convert_typeX, wchar_t> converterX;
return converterX.from_bytes(str);
}
/*----------------------------------------------------------------------------------------*/
/*--- ClientSocketToShell - Read client response then write to pipe process ---*/
/*----------------------------------------------------------------------------------------*/
DWORD WINAPI Gear::ClientSocketToShell(LPVOID lpParameter)
{
sThreadInfo *stI = (sThreadInfo*)lpParameter;
BYTE buffer[4096];
fd_set rds;
DWORD BytesWritten;
while (!stI->Stop) {
FD_ZERO(&rds);
FD_SET(stI->sockfd, &rds);
timeval timeout;
timeout.tv_sec = 1;
timeout.tv_usec = 0;
int ret = select(0, &rds, NULL, NULL, &timeout);
if (ret < 0)
break;
if (ret > 0) {
ret = SSL_read(stI->ssl, (char *)buffer, sizeof(buffer) - 1);
if (ret <= 0)
break;
if (!WriteFile(stI->hStdIn, buffer, ret, &BytesWritten, NULL))
break;
}
}
return(0);
}