您的位置:首页 > 编程语言 > C语言/C++

VC++(unicode)实现URLDecode函数,对URl编码的字符串进行解码

2017-08-04 14:49 309 查看
JAVA中使用Urlencode.encoder,

但是用vc++开发过程中,需要对URL编码的字符串进行编码,也就是URLDecode函数,此代码是从网上找到的,但是对url编码字符串解码结果不太正常,稍加了一点改动,可以正常对url编码字符串解码。代码如下:

#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);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  vc utf-8 java