萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> 編程語言綜合 >> C++實現UrlEncode和UrlDecode

C++實現UrlEncode和UrlDecode

  #include "stdafx.h"

  #include

  #include

  #include

  using namespace std;

  std::string UrlEncode(const std::string& szToEncode)

  {

  std::string src = szToEncode;

  char hex[] = "0123456789ABCDEF";

  string dst;

  for (size_t i = 0; i < src.size(); ++i)

  {

  unsigned char cc = src[i];

  if (isascii(cc))

  {

  if (cc == ' ')

  {

  dst += "%20";

  }

  else

  dst += cc;

  }

  else

  {

  unsigned char c = static_cast(src[i]);

  dst += '%';

  dst += hex[c / 16];

  dst += hex[c % 16];

  }

  }

  return dst;

  }

  std::string UrlDecode(const std::string& szToDecode)

  {

  std::string result;

  int hex = 0;

  for (size_t i = 0; i < szToDecode.length(); ++i)

  {

  switch (szToDecode[i])

  {

  case '+':

  result += ' ';

  break;

  case '%':

  if (isxdigit(szToDecode[i + 1]) && isxdigit(szToDecode[i + 2]))

  {

  std::string hexStr = szToDecode.substr(i + 1, 2);

  hex = strtol(hexStr.c_str(), 0, 16);

  //字母和數字[0-9a-zA-Z]、一些特殊符號[$-_.+!*'(),] 、以及某些保留字[$&+,/:;=?@]

  //可以不經過編碼直接用於URL

  if (!((hex >= 48 && hex <= 57) || //0-9

  (hex >=97 && hex <= 122) || //a-z

  (hex >=65 && hex <= 90) || //A-Z

  //一些特殊符號及保留字[$-_.+!*'(),] [$&+,/:;=?@]

  hex == 0x21 || hex == 0x24 || hex == 0x26 || hex == 0x27 || hex == 0x28 || hex == 0x29

  || hex == 0x2a || hex == 0x2b|| hex == 0x2c || hex == 0x2d || hex == 0x2e || hex == 0x2f

  || hex == 0x3A || hex == 0x3B|| hex == 0x3D || hex == 0x3f || hex == 0x40 || hex == 0x5f

  ))

  {

  result += char(hex);

  i += 2;

  }

  else result += '%';

  }else {

  result += '%';

  }

  break;

  default:

  result += szToDecode[i];

  break;

  }

  }

  return result;

  }

  /*

  int main()

  {

  string test_str1 = "爽爽";

  string test_str2 = UrlEncode(test_str1);

  cout << test_str2 << endl;

  }

  */

copyright © 萬盛學電腦網 all rights reserved