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

本文介绍了一个 VC++ 实现的 URL 编码和解码函数。该实现支持 UTF-8 编码,并对原始代码进行了改进,确保了解码过程的正确性。通过这些函数,开发者可以在 C++ 应用程序中轻松处理经过 URL 编码的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值