最近在做的一个项目,需要通过URL向服务器提交中文字符
例如:http://192.168.0.1/myServers/willdo?want=想做点事
网上找了一堆的C++ 有关URLEncode,都写得复杂看得更复杂.
其实产URLENCODE后的%XX%XX就是字符的UTF编码的16进制数;
示例代码(在VS2013通过)
#ifdef UNICODE
#define STRING std::wstring
#define CCHAR wchat_t
#endif
CString CMainWndDlg::UrlEncode(CString srcString)
{
STRING strTmp= _T(" ");//字符窜前面加空格,如果不加,第一个字符encode后会变成0;
strTmp += srcString.GetBuffer();
std::string tmp = boost::locale::conv::from_utf<CCHAR>(strTmp, "UTF-8");
int len = tmp.length();
CString strRet;
strRet.Empty();
for (int nIndex = 1; nIndex < len; nIndex++)
{
BYTE nCode = (BYTE)tmp[nIndex];
CCHAR cCode[3];
_itow(nCode, cCode, 16);
strRet += _T("%");
strRet += cCode;
memset(cCode, 0, sizeof(CCHAR) * 3);
}
return strRet;
}
注:不知为什么,第一个字符转换后总是0,可能是BOOST库的BUG.
所以在整个字符窜前加个空格再进行encode就正确了.所以我们解释是从第2个字符(也就是tmp[1]开始,最后一个\0不解释);