您的位置:首页 > 其它

URL编解码

2015-06-18 05:56 507 查看
//URL编码
BSTR URLEncode(LPCSTR srcURL, UINT CodePage = CP_ACP)
{
BSTR bstrVal = NULL;

int iWchLen=0, iUtf8Len=0, iEncLen = 0;
wchar_t *wchBuff = NULL;
char *utf8Buff = NULL;
char *encURL = NULL;
unsigned char chV, chH, chL;

//先转换成UNICODE
iWchLen = ::MultiByteToWideChar(CodePage, 0, srcURL, -1, NULL, 0);
wchBuff = (wchar_t *)_alloca((iWchLen+1)*sizeof(wchar_t));
::MultiByteToWideChar(CodePage, 0, srcURL, -1, wchBuff, iWchLen);

//转成UTF8
iUtf8Len = ::WideCharToMultiByte(CP_UTF8, 0, wchBuff, -1, NULL, 0,  NULL, NULL);
utf8Buff = (char*)_alloca(iUtf8Len+1);
::WideCharToMultiByte(CP_UTF8, 0, wchBuff, -1, utf8Buff, iUtf8Len,  NULL, NULL);

//编码 (将非ASC码转换成%HH的十六进制字符)
iEncLen = 0;
encURL = (char *)_alloca(iUtf8Len * 3 + 1);
while((chV = (unsigned char)*utf8Buff++) != 0)
{
if(chV > 0x20 && chV < 0x7F) //ASCII
{
encURL[iEncLen++] = chV;
}
else
{
chH = chV>>4, chL = chV & 0x0F;
encURL[iEncLen++] = '%';
encURL[iEncLen++] = chH >= 10 ? (chH - 10 + 'A'):(chH - 0 + '0');
encURL[iEncLen++] = chL >= 10 ? (chL - 10 + 'A'):(chL - 0 + '0');
}
}
encURL[iEncLen] = 0; //结束符

printf("SrcURL:%s\nUnicode:%s\nUtf8:%s\nencURL:%s\n",
srcURL, wchBuff, utf8Buff, encURL);

bstrVal = _bstr_t(encURL);

return bstrVal;
}

//URL解码
BSTR URLDecode(LPCSTR srcURL, UINT CodePage = CP_ACP)
{
BSTR bstrVal = NULL;

int iWchLen=0, iUtf8Len=0, iDecLen = 0;
wchar_t *wchBuff = NULL;
char *utf8Buff = NULL;
char *decURL = NULL;
unsigned char chV, chH, chL;

//解码 (转换%HH的十六进制字符)
iUtf8Len = 0;
utf8Buff = (char*)_alloca(strlen(srcURL) + 1);
while((chV = (unsigned char)*srcURL++) != 0)
{
if(chV == '%')
{
chH = *srcURL++;
if(chH >= '0' && chH <= '9')
chH -= '0';
else if(chH >= 'A' && chH <= 'F')
chH = chH - 'A' + 10;
else if(chH >= 'a' && chH <= 'f')
chH = chH - 'a' + 10;
else
chH = 0;

chL = *srcURL++;
if(chL >= '0' && chL <= '9')
chL -= '0';
else if(chL >= 'A' && chL <= 'F')
chL = chL - 'A' + 10;
else if(chL >= 'a' && chL <= 'f')
chL = chL - 'a' + 10;
else
chL = 0;

chV = (chH <<4) | chL;
}

utf8Buff[iUtf8Len++] = chV;
}
utf8Buff[iUtf8Len] = 0; //结束符

//换成UNICODE
iWchLen = ::MultiByteToWideChar(CP_UTF8, 0, utf8Buff, -1, NULL, 0);
wchBuff = (wchar_t *)_alloca((iWchLen+1)*sizeof(wchar_t));
::MultiByteToWideChar(CP_UTF8, 0, utf8Buff, -1, wchBuff, iWchLen);

//转成CP_ACP
iDecLen = ::WideCharToMultiByte(CodePage, 0, wchBuff, -1, NULL, 0,  NULL, NULL);
decURL = (char*)_alloca(iDecLen+1);
::WideCharToMultiByte(CodePage, 0, wchBuff, -1, decURL, iDecLen,  NULL, NULL);

printf("SrcURL:%s\nUtf8:%s\nUnicode:%s\ndecURL:%s\n",
srcURL, utf8Buff, wchBuff, decURL);

bstrVal = _bstr_t(decURL);

return bstrVal;
}


void TestURLEndDec()
{
LPCSTR srcURL = "http://www.oschina.net/search?scope=bbs&q=C语言";

_bstr_t encURL = URLEncode(srcURL);
_bstr_t decURL = URLDecode(encURL);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: