|
vc++中进行urlencode和urldecode
- #define IsHexNum(c) ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f'))
- //urf8编码字符串处理
- CString Utf8ToStringT(LPSTR str)
- {
- _ASSERT(str);
- USES_CONVERSION;
- WCHAR *buf;
- int length = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0);
- buf = new WCHAR[length+1];
- ZeroMemory(buf, (length+1) * sizeof(WCHAR));
- MultiByteToWideChar(CP_UTF8, 0, str, -1, buf, length);
- return (CString(W2T(buf)));
- }
- //url编码字符串解码函数
- CString UrlDecode(LPCTSTR url)
- {
- _ASSERT(url);
- USES_CONVERSION;
- LPSTR _url = T2A(const_cast<LPTSTR>(url));
- int i = 0;
- int length = (int)strlen(_url);
- CHAR *buf = new CHAR[length];
- ZeroMemory(buf, length);
- LPSTR p = buf;
- char tmp[4];
- while(i < length)
- {
- if(i <= length -3 && _url[i] == '%' && IsHexNum(_url[i+1]) && IsHexNum(_url[i+2]))
- {
- memset(tmp, 0, sizeof(tmp));
- memcpy(tmp, _url + i + 1,2);
- sscanf(tmp, "%x", p++);
- i += 3;
- }
- else
- {
- *(p++) = _url[i++];
- }
- }
- //return CString(buf);
- return Utf8ToStringT(buf);
- }
- //进行Url编码 UTF - 8
- CString UrlEncode(CString strUnicode)
- {
- LPCWSTR unicode = T2CW(strUnicode);
- int len = WideCharToMultiByte(CP_UTF8, 0, unicode, -1, 0, 0, 0, 0);
- if (!len)
- return strUnicode;
- char *utf8 = new char[len + 1];
- char *utf8temp = utf8;
- WideCharToMultiByte(CP_UTF8, 0, unicode, -1, utf8, len + 1, 0, 0);
- utf8[len] = NULL;
- CString strTemp, strEncodeData;
- while (*utf8!= '\0')
- {
- strTemp.Format(_T("%%%2x"), (BYTE)*utf8);
- strEncodeData += strTemp;
- ++utf8;
- }
- delete[]utf8temp;
- return CString(strEncodeData);
- }
复制代码
|
|