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++开发过程中,需要对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);
}
相关文章推荐
- 直接使用默认设置进行打印:(3)使用VC开发ActiveX控件实现打印中文字符串
- ORACLE使用UTL_URL包对字符串进行URL编码解码
- JavaSE8基础 String 对字符串进行编码 对字节数组进行解码
- 关于VC++中,两种自定义消息的发送与接收的方法实现进行说明。
- VC中Unicode字符串的处理
- VC中Unicode字符串的处理
- php实现按utf8编码对字符串进行分割
- C#与JS实现URI对汉字进行编码、解码
- 关于VC++中,两种自定义消息的发送与接收的方法实现进行说明
- 对多次编码的字符串进行解码。
- 对字符串进行HTML编码和解码的JavaScript函数
- 增强String replace方法,实现对字符串进行模板替换,支持对象、数组
- VC 实现传入不定参数个数 字符串输出
- textarea实现从其他html标签中取出的字符串,进行换行
- Java实现的URL编码和解码技术
- C/C++/VC 实现字符串逆转的多种方法
- SQL Server实现将特定字符串拆分并进行插入操作的方法
- VC下几种转换为UNICODE字符串的方法