解决WideCharToMultiByte转码时,结尾一个字符乱码问题

来源:赵克立博客 分类: C/C++ 标签:duilib乱码发布时间:2017-10-22 20:01:03最后更新:2017-10-22 22:32:00浏览:3381
版权声明:
本文为博主原创文章,转载请声明原文链接...谢谢。o_0。
更新时间:
2017-10-22 22:32:00
温馨提示:
学无止境,技术类文章有它的时效性,请留意文章更新时间,如发现内容有误请留言指出,防止别人"踩坑",我会及时更新文章

用c++写一个请求网页数据到最后转码的时候前面的数据都正常就是最后老是带着一个或几个乱码字符如下,怎么都去不掉。:(

image.png

经过各种调试最后发现问题所在,数据请求回来后进行啦转码,最后一步转码后最后的一个字符转成啦乱码。然后网上找方法,还好有人遇到啦同样的问题,解决掉喽。


有问题的代码:

string restr="请求回来的数据";
DWORD dwNum = MultiByteToWideChar(CP_ACP, 0, restr.c_str(), -1, NULL, 0);    //返回原始ASCII码的字符数目       
wchar_t* pwText = new wchar_t[dwNum];                                  //根据ASCII码的字符数分配UTF8的空间
MultiByteToWideChar(CP_UTF8, 0, restr.c_str(), -1, pwText, dwNum);
//宽字节转为多字节
int nBytes = WideCharToMultiByte(CP_ACP, 0, pwText, wcslen(pwText), NULL, 0, NULL, NULL);
char* m_char = new char[nBytes + 1];
//下面这一行会导致最后一个字符乱码
WideCharToMultiByte(CP_ACP, 0, pwText, wcslen(pwText), m_char, nBytes , NULL, NULL);
restr = m_char;

上面代码最后的 restr 最后一个字符乱码,改为下面代码就可以啦

//下面两种写法都可以 
WideCharToMultiByte(CP_ACP, 0, pwText,wcslen(pwText)+1, m_char, nBytes+1, NULL, NULL);
WideCharToMultiByte(CP_ACP, 0, pwText,-1, m_char, nBytes+1, NULL, NULL);

 第4个参数为-1时,字符串pwText 将被设定为以NULL为结束符的字符串,并且自动计算长度。WideCharToMultiByte(CP_ACP,0,pwText,wcslen(pwText),p,len,NULL,NULL);采用这种方式时,pwText结束符不会被转换到p中去,因为wcslen(pwText)不包括结束符WideCharToMultiByte(CP_ACP,0,pwText,-1,p,len,NULL,NULL);采用这种方式时,pwText结束符不会被转换到p中去,因为len长度不够放结束符,



微信号:kelicom QQ群:215861553 紧急求助须知
Win32/PHP/JS/Android/Python