[分享]解决C++ client socket send to Workerman 中文乱码问题

在windows上 用正常的socket
send(s,"你好世界",4,0);

这样workerman服务器收到的始终是乱码.这是因为workerman里使用的都是 utf-8

因此发送之前,一定要。
string UnicodeToUTF8(const wstring& str)
{
char* pElementText;
int iTextLen;
// wide char to multi char
iTextLen = WideCharToMultiByte(936,
0,
str.c_str(),
-1,
NULL,
0,
NULL,
NULL);
pElementText = new char[iTextLen + 1];
memset((void[i])pElementText, 0, sizeof(char) [/i] (iTextLen + 1));
::WideCharToMultiByte(CP_UTF8,
0,
str.c_str(),
-1,
pElementText,
iTextLen,
NULL,
NULL);
string strText;
strText = pElementText;
delete pElementText;
return strText;
}

wstring str = L"你好世界";
string utf8str = UnicodeToUTF8(str);
send(s,utf8str.cstr(),utf8str.length(),0);
上面的会被截断一部分文字,故把字节buffer弄大了一点,就没问题了。
修正如下,
string UnicodeToUTF8(const wstring& str)
{
char* pElementText;
int iTextLen;
// wide char to multi char
iTextLen = WideCharToMultiByte(936,
0,
str.c_str(),
-1,
NULL,
0,
NULL,
NULL);
pElementText = new char[iTextLen*2 + 1];
memset((void[i])pElementText, 0, sizeof(char) [/i] (iTextLen*2 + 1));
::WideCharToMultiByte(CP_UTF8,
0,
str.c_str(),
-1,
pElementText,
iTextLen*2,
NULL,
NULL);
string strText;
strText = pElementText;
delete pElementText;
return strText;
}

1 个评论

感谢@egirlasm的分享

要回复文章请先登录注册