wininet 封装 http请求(POST/GET)WEB服务器返回一个UTF8的JSON数组,不经过编码则会显示为乱码,但,通过转换后,中文虽然正确显示,但会有多余的“?”号出现。
过程如下:
int main(int argc, char *argv[]){
AKHTTPWrapper akwrapper;
std::string responseString;
if(akwrapper.Connect("http://www.chinaeko.net")){
if(akwrapper.Request("/api.php?m=Business&a=doc2")){
char buf[1024]="\0";
while(akwrapper.Response(reinterpret_cast<unsigned char *>(buf), 1024))
responseString +=(char*) buf ;
}
akwrapper.Close();
std::wstring finalString = UTF8toUnicode(&responseString);
cout << finalString << endl;
}
return 0;
}
//UTF8 to Unicode
std::wstring AKHTTPWrapper::UTF8toUnicode(const std::string &str){
int len = 0;
len = str.length();
int unicodeLen = ::MultiByteToWideChar( CP_UTF8,0,str.c_str(),-1,NULL,0);
wchar_t * pUnicode;
pUnicode = new wchar_t[unicodeLen+1];
memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t));
::MultiByteToWideChar( CP_UTF8,0,str.c_str(),-1,(LPWSTR)pUnicode,unicodeLen);
wstring rt;
rt = (wchar_t*)pUnicode;
delete pUnicode;
return rt;
}
多余的字符是不是转换的时候长度没控制对
没有证却处理原来字符串中的'\0'导致字符串没有正确截断。
你可以调用下trim函数将?截断。
@caozhy
大牛,你的意思是指 每次接收到buf后,对buf进行trim处理吗?!如下面
while(akwrapper.Response(reinterpret_cast(buf), 1024))
responseString +=(char*) trim(buf) ;//是这样吗!?
@oyljerry
大牛,请指教如何修改转换函数 UTF8toUnicode 才正确? 还是说,我在接收数据时buf的长度要动态分配?但是,buf我是直接把地址传进去的,要确定长度怎么办?