C++实现encodeURI

兼容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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值