URL编解码



//URL编码
BSTR URLEncode(LPCSTR srcURL, UINT CodePage = CP_ACP)
{
  BSTR bstrVal = NULL;

  int iWchLen=0, iUtf8Len=0, iEncLen = 0;
  wchar_t *wchBuff = NULL;
  char *utf8Buff = NULL;
  char *encURL = NULL;
  unsigned char chV, chH, chL;

  //先转换成UNICODE
  iWchLen = ::MultiByteToWideChar(CodePage, 0, srcURL, -1, NULL, 0);
  wchBuff = (wchar_t *)_alloca((iWchLen+1)*sizeof(wchar_t));
  ::MultiByteToWideChar(CodePage, 0, srcURL, -1, wchBuff, iWchLen);

  //转成UTF8
  iUtf8Len = ::WideCharToMultiByte(CP_UTF8, 0, wchBuff, -1, NULL, 0,  NULL, NULL);
  utf8Buff = (char*)_alloca(iUtf8Len+1);
  ::WideCharToMultiByte(CP_UTF8, 0, wchBuff, -1, utf8Buff, iUtf8Len,  NULL, NULL);

  //编码 (将非ASC码转换成%HH的十六进制字符)
  iEncLen = 0;
  encURL = (char *)_alloca(iUtf8Len * 3 + 1);    
  while((chV = (unsigned char)*utf8Buff++) != 0)
  {    
    if(chV > 0x20 && chV < 0x7F) //ASCII
    {
      encURL[iEncLen++] = chV;
    }
    else
    {
      chH = chV>>4, chL = chV & 0x0F;
      encURL[iEncLen++] = '%';
      encURL[iEncLen++] = chH >= 10 ? (chH - 10 + 'A'):(chH - 0 + '0');
      encURL[iEncLen++] = chL >= 10 ? (chL - 10 + 'A'):(chL - 0 + '0');
    }
  }
  encURL[iEncLen] = 0; //结束符

  printf("SrcURL:%s\nUnicode:%s\nUtf8:%s\nencURL:%s\n",
    srcURL, wchBuff, utf8Buff, encURL);
  
  bstrVal = _bstr_t(encURL);

  return bstrVal;
}

//URL解码
BSTR URLDecode(LPCSTR srcURL, UINT CodePage = CP_ACP)
{
  BSTR bstrVal = NULL;

  int iWchLen=0, iUtf8Len=0, iDecLen = 0;
  wchar_t *wchBuff = NULL;
  char *utf8Buff = NULL;
  char *decURL = NULL;
  unsigned char chV, chH, chL;

  //解码 (转换%HH的十六进制字符)
  iUtf8Len = 0;
  utf8Buff = (char*)_alloca(strlen(srcURL) + 1);
  while((chV = (unsigned char)*srcURL++) != 0)
  {
    if(chV == '%')
    {
      chH = *srcURL++; 
      if(chH >= '0' && chH <= '9')
        chH -= '0';
      else if(chH >= 'A' && chH <= 'F')
        chH = chH - 'A' + 10;
      else if(chH >= 'a' && chH <= 'f')
        chH = chH - 'a' + 10;
      else
        chH = 0;

      chL = *srcURL++;
      if(chL >= '0' && chL <= '9')
        chL -= '0';
      else if(chL >= 'A' && chL <= 'F')
        chL = chL - 'A' + 10;
      else if(chL >= 'a' && chL <= 'f')
        chL = chL - 'a' + 10;
      else
        chL = 0;

      chV = (chH <<4) | chL;
    }
        
    utf8Buff[iUtf8Len++] = chV;    
  }
  utf8Buff[iUtf8Len] = 0; //结束符

  //换成UNICODE
  iWchLen = ::MultiByteToWideChar(CP_UTF8, 0, utf8Buff, -1, NULL, 0);
  wchBuff = (wchar_t *)_alloca((iWchLen+1)*sizeof(wchar_t));
  ::MultiByteToWideChar(CP_UTF8, 0, utf8Buff, -1, wchBuff, iWchLen);

  //转成CP_ACP
  iDecLen = ::WideCharToMultiByte(CodePage, 0, wchBuff, -1, NULL, 0,  NULL, NULL);
  decURL = (char*)_alloca(iDecLen+1);
  ::WideCharToMultiByte(CodePage, 0, wchBuff, -1, decURL, iDecLen,  NULL, NULL);

  printf("SrcURL:%s\nUtf8:%s\nUnicode:%s\ndecURL:%s\n",
    srcURL, utf8Buff, wchBuff, decURL);
  
  bstrVal = _bstr_t(decURL);

  return bstrVal;
}




void TestURLEndDec()
{
  LPCSTR srcURL = "http://www.oschina.net/search?scope=bbs&q=C语言";

  _bstr_t encURL = URLEncode(srcURL);
  _bstr_t decURL = URLDecode(encURL);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值