首先,需要先了解HttpUtility.UrlEncode是怎样编码的:
1.数字和字母不变。
2.空格变为"+"号。
3.其他被编码成"%"加上他们的ascii的十六进制,规律是这样的
比如汉字“啊”字 Ascii的十六进制是B0A1,则编码后为"%B0%A1"(每个字节前加个%)。
/*******************************************
* URLCode.h
******************************************/
#pragma once
#include <string>
using namespace std;
using namespace std;
class CURLCode
{
public:
CURLCode(){};
virtual ~CURLCode(){};
static string Encode(const char* lpszData);
static string Decode(string inTmp);
{
public:
CURLCode(){};
virtual ~CURLCode(){};
static string Encode(const char* lpszData);
static string Decode(string inTmp);
private:
inline static unsigned char toHex(const unsigned char &x){ return x > 9 ? x + 55: x + 48; }
inline static unsigned char fromHex(const unsigned char &x){ return x > 64 ? x - 55 : x - 48; }
};
inline static unsigned char toHex(const unsigned char &x){ return x > 9 ? x + 55: x + 48; }
inline static unsigned char fromHex(const unsigned char &x){ return x > 64 ? x - 55 : x - 48; }
};
/*******************************************
* URLCode.cpp
******************************************/
#include "URLCode.h"
string CURLCode::Encode(const char* lpszData)
{
string strResult = "";
unsigned char* pInTmp = (unsigned char*)lpszData;
{
string strResult = "";
unsigned char* pInTmp = (unsigned char*)lpszData;
// do encoding
while (*pInTmp)
{
if(isalnum(*pInTmp))
strResult += *pInTmp;
else
if(isspace(*pInTmp))
strResult += '+';
else
{
strResult += '%';
strResult += toHex(*pInTmp>>4);
strResult += toHex(*pInTmp%16);
}
while (*pInTmp)
{
if(isalnum(*pInTmp))
strResult += *pInTmp;
else
if(isspace(*pInTmp))
strResult += '+';
else
{
strResult += '%';
strResult += toHex(*pInTmp>>4);
strResult += toHex(*pInTmp%16);
}
pInTmp++;
}
return strResult;
}
}
return strResult;
}
string CURLCode::Decode(string inTmp)
{
string strResult = "";
int inlen = inTmp.length();
for(int i=0;i<inlen;i++)
{
if(inTmp.at(i)=='%')
{
i++;
char c = fromHex(inTmp.at(i++));
c = c << 4;
c += fromHex(inTmp.at(i));
strResult += c;
}
else if(inTmp.at(i)=='+')
strResult += ' ';
else
strResult += inTmp.at(i);
}
{
string strResult = "";
int inlen = inTmp.length();
for(int i=0;i<inlen;i++)
{
if(inTmp.at(i)=='%')
{
i++;
char c = fromHex(inTmp.at(i++));
c = c << 4;
c += fromHex(inTmp.at(i));
strResult += c;
}
else if(inTmp.at(i)=='+')
strResult += ' ';
else
strResult += inTmp.at(i);
}
return strResult;
}
}