兼容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,大功告成!