首页 > 代码库 > (C++)UrlEncode的标准实现

(C++)UrlEncode的标准实现

关于UrlEncode的实现(C++),网上有很多不同的版本,对需要编码的字符集的选取并不统一。那么到底有没有标准呢?答案是有的,参见wiki

    绝对不编码的,只有字母、数字、短横线(-)、下划线(_)、点(.)和波浪号(~),其他字符要视情况而定,所以一般性的urlencode只需保留上述字符不进行编码。

    下面给出实现:

    unsigned char ToHex(unsigned char x)       {           return  x > 9 ? x + 55 : x + 48;       }            unsigned char FromHex(unsigned char x)       {           unsigned char y;          if (x >= A && x <= Z) y = x - A + 10;          else if (x >= a && x <= z) y = x - a + 10;          else if (x >= 0 && x <= 9) y = x - 0;          else assert(0);          return y;      }            std::string UrlEncode(const std::string& str)      {          std::string strTemp = "";          size_t length = str.length();          for (size_t i = 0; i < length; i++)          {              if (isalnum((unsigned char)str[i]) ||                   (str[i] == -) ||                  (str[i] == _) ||                   (str[i] == .) ||                   (str[i] == ~))                  strTemp += str[i];              else if (str[i] ==  )                  strTemp += "+";              else              {                  strTemp += %;                  strTemp += ToHex((unsigned char)str[i] >> 4);                  strTemp += ToHex((unsigned char)str[i] % 16);              }          }          return strTemp;      }            std::string UrlDecode(const std::string& str)      {          std::string strTemp = "";          size_t length = str.length();          for (size_t i = 0; i < length; i++)          {              if (str[i] == +) strTemp +=  ;              else if (str[i] == %)              {                  assert(i + 2 < length);                  unsigned char high = FromHex((unsigned char)str[++i]);                  unsigned char low = FromHex((unsigned char)str[++i]);                  strTemp += high*16 + low;              }              else strTemp += str[i];          }          return strTemp;      }  

 

(C++)UrlEncode的标准实现