C++实现encodeURI

来源:互联网 发布:小林聪美 知乎 编辑:程序博客网 时间:2024/06/01 21:58

转自:http://blog.csdn.net/laironggui/article/details/40826961


兼容VS的Unicode和多字节环境。

1、const char *_encodeURI(const char *Str)函数是抄的别人的,但是做了微调整,红色部分

const char *_encodeURI(const char *Str)
{
wchar_t *Bufw = NULL;
char *Bufc = NULL;
static char RTV[5120] = {0};//原作者此处声明为char RTV[5120],这里将其改为静态的
long needSize = MultiByteToWideChar(CP_ACP,NULL,Str,-1,NULL,0);
if ( 0 == needSize ) goto ERROR_HANDLE;

Bufw = new wchar_t[needSize];
if ( NULL == Bufw ) goto ERROR_HANDLE;

memset(Bufw,0x0,needSize*2);
MultiByteToWideChar(CP_ACP,NULL,Str,-1,Bufw,needSize);

needSize = WideCharToMultiByte(CP_UTF8,NULL,Bufw,-1,NULL,0,NULL,NULL);
if ( 0 == needSize ) goto ERROR_HANDLE;

Bufc = new char[needSize];
if ( NULL == Bufc ) goto ERROR_HANDLE;

memset(Bufc,0x0,needSize);
WideCharToMultiByte(CP_UTF8,NULL,Bufw,-1,Bufc,needSize,NULL,NULL);

unsigned char *pWork = (unsigned char *)Bufc;
memset(RTV,0x0,sizeof(RTV));
if ( strlen(Bufc) > 5120 )

goto ERROR_HANDLE;
}
while( *pWork != 0x0 )
{
if ( *pWork != '!' && *pWork != '@' && *pWork != '#' &&
*pWork != '$' && *pWork != '&' && *pWork != '*' &&
*pWork != '(' && *pWork != ')' && *pWork != '=' &&
*pWork != ':' && *pWork != '/' && *pWork != ';' &&
*pWork != '?' && *pWork != '+' && *pWork != '\'' &&
*pWork != '.' )
{
sprintf(RTV+strlen(RTV),"%%%2X",*pWork);
}
else
{
sprintf(RTV+strlen(RTV),"%c",*pWork);
}
pWork++;
}
if ( NULL != Bufw )
{
delete [] Bufw;
Bufw = NULL;
}
if ( NULL != Bufc )
{
delete [] Bufc;
Bufc = NULL;
}
return RTV;
ERROR_HANDLE:
if ( NULL != Bufw )
{
delete [] Bufw;
Bufw = NULL;
}
if ( NULL != Bufc )
{
delete [] Bufc;
Bufc = NULL;
}
return NULL;
}



2、本人是搞CAD二次开发的,vc6-vs2012都要使用,为了方便调用,特意简单封装了一下:
CString encodeURI(CString Str)
{
#ifdef UNICODE
CStringA s1 = (CStringA)Str;
CStringA s2 = _encodeURI(s1.GetBuffer());
s1.ReleaseBuffer();
return (CString)s2;
#else
return _encodeURI(Str);
#endif
}

3、调用时很简单(Unicode和多字节下方法一样):

CString str = encodeURI(_T("超级管理员"));

//结果为:%E8%B6%85%E7%BA%A7%E7%AE%A1%E7%90%86%E5%91%98

OK,大功告成!


0 0
原创粉丝点击