C++实现encodeURI 2

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

const char *encodeURI(const char *Str)
{
 wchar_t *Bufw = NULL;
 char *Bufc = NULL;
 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;
}

int main(void)
{
 printf("%s\n",encodeURI("站名=装饰装修评价网"));

 fflush(stdin);
 getchar();
 return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值