C++中的URL编码解码

 

static CString URLDecode(CString sIn)
 {
  CString sOut;
  const int nLen = sIn.GetLength() + 1;
  register LPBYTE pOutTmp = NULL;
  LPBYTE pOutBuf = NULL;
  register LPBYTE pInTmp = NULL;
  LPBYTE pInBuf =(LPBYTE)sIn.GetBuffer(nLen);
  //alloc out buffer
  pOutBuf = (LPBYTE)sOut.GetBuffer(nLen);

  if(pOutBuf)
  {
   pInTmp   = pInBuf;
   pOutTmp = pOutBuf;
   // do encoding
   while (*pInTmp)
   {
    if('%'==*pInTmp)
    {
     pInTmp++;
     *pOutTmp++ = (toByte(*pInTmp)%16<<4) + toByte(*(pInTmp+1))%16;//高4位+低4位
     pInTmp++;
    }
    else if('+'==*pInTmp)
     *pOutTmp++ = ' ';
    else
     *pOutTmp++ = *pInTmp;
    pInTmp++;
   }
   *pOutTmp = '\0';
  }
  sIn.ReleaseBuffer();

  return sOut;
 }

 static string  URLEncode(const string sIn)
 {
  map<char,string> unsafeCharMap;
  unsafeCharMap.insert(std::pair<char, string>('\"',"%22"));
  unsafeCharMap.insert(std::pair<char, string>('<',"%3C"));
  unsafeCharMap.insert(std::pair<char, string>('>',"%3E"));
  unsafeCharMap.insert(std::pair<char, string>('#',"%23"));
  unsafeCharMap.insert(std::pair<char, string>('%',"%25"));
  unsafeCharMap.insert(std::pair<char, string>('{',"%7B"));
  unsafeCharMap.insert(std::pair<char, string>('}',"%7D"));
  unsafeCharMap.insert(std::pair<char, string>('|',"%7C"));
  unsafeCharMap.insert(std::pair<char, string>('\\',"%5C"));
  unsafeCharMap.insert(std::pair<char, string>('^',"%5E"));
  unsafeCharMap.insert(std::pair<char, string>('~',"%7E"));
  unsafeCharMap.insert(std::pair<char, string>('[',"%5B"));
  unsafeCharMap.insert(std::pair<char, string>(']',"%5D"));
  unsafeCharMap.insert(std::pair<char, string>('`',"%60"));
  unsafeCharMap.insert(std::pair<char, string>('$',"%24"));
  unsafeCharMap.insert(std::pair<char, string>('&',"%26"));
  unsafeCharMap.insert(std::pair<char, string>('+',"%2B"));
  unsafeCharMap.insert(std::pair<char, string>(',',"%2C"));
  unsafeCharMap.insert(std::pair<char, string>('/',"%2F"));
  unsafeCharMap.insert(std::pair<char, string>(':',"%3A"));
  unsafeCharMap.insert(std::pair<char, string>(';',"%3B"));
  unsafeCharMap.insert(std::pair<char, string>('=',"%3D"));
  unsafeCharMap.insert(std::pair<char, string>('?',"%3F"));
  unsafeCharMap.insert(std::pair<char, string>('@',"%40"));


  string sOut;
  for( size_t ix = 0; ix < sIn.size(); ix++ )
  {      
   map<char, string>::iterator item = unsafeCharMap.find(sIn[ix]);
      if (item != unsafeCharMap.end())
      {
    sOut += item->second;
    continue;
      }

   BYTE buf[4];
   memset( buf, 0, 4 );
   if( isalnum( (BYTE)sIn[ix] ) )
   {      
    buf[0] = sIn[ix];
   }
   else if ( sIn[ix] == '\n' )
   {
    sOut += "\n";
    continue;
   }
   else if ( isspace( (BYTE)sIn[ix] ) )
   {
    buf[0] = '+';
   }
   else
   {
    buf[0] = '%';
    buf[1] = toHex( (BYTE)sIn[ix] >> 4 );
    buf[2] = toHex( (BYTE)sIn[ix] % 16);
   }
   sOut += (char *)buf;
  }
  sOut = Replace(sOut, "%E0%82%B7", "%c2%b7");
  sOut = Replace(sOut, "%E0%83%97", "%c3%97");

  return sOut;
 };

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值