网络传输文本,urlEncode和decode的iOS实现。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wutiyixin/article/details/24519717

url Encode和Decode的实现

源码下载地址(vs2005版本):http://download.csdn.net/detail/hherima/5108862

也可以下载源码(ios版本):http://download.csdn.net/detail/hherima/5108862


下面是IOS的源码,注意将源文件后缀改为mm相关的VC后缀也改为mm

头文件

[cpp]  view plain copy
  1. using namespace std;  
  2. #include <string.h>  
  3. #include <iostream>  
  4.   
  5. class UrlEncode  
  6. {  
  7. public:  
  8.     NSString* Encode(NSString*src);  
  9.     NSString* Decode(NSString* src);  
  10. private:  
  11.     string HttpUrlDecode(const string& srcUrl);  
  12.     string HttpUrlEncode(const string& srcUrl);  
  13.     int hexchar2int(char c);  
  14.     string UrlEncodeFormat(const unsigned char cValue);  
  15.     string DecimalToHexString(unsigned int nValue);  
  16.   
  17. };  
源文件

[cpp]  view plain copy
  1. #include "UrlEncode.h"  
  2.   
  3. NSString* UrlEncode::Encode(NSString*src)  
  4. {  
  5.     string buf = HttpUrlEncode([src UTF8String]);  
  6.     return [NSString stringWithUTF8String:buf.c_str()];  
  7. }  
  8. //  
  9. NSString* UrlEncode::Decode(NSString* src)  
  10. {  
  11.     string buf = HttpUrlDecode([src UTF8String]);  
  12.     return [NSString stringWithUTF8String:buf.c_str()];  
  13. }  
  14. //  
  15. string UrlEncode::HttpUrlDecode(const string& srcUrl)  
  16. {  
  17.     string   desStr;  
  18.     int length = 0;  
  19.     int flag      =1;  
  20.     unsigned char firstNum  = 0;  
  21.     unsigned char SecondNum = 0;  
  22.     const char * pchar = srcUrl.c_str();//.Ptr();  
  23.     while(length < srcUrl.length())  
  24.     {  
  25.         if(pchar[length]=='%')//&& length < srcUrl.length()-2  
  26.         {  
  27.             //最后一位,need break;  
  28.             if(length == srcUrl.length()-1)  
  29.             {  
  30.                 desStr +=pchar[length];//.append(pchar[length]);  
  31.                 break;  
  32.             }  
  33.             //正常移位  
  34.             length++;   firstNum = hexchar2int(pchar[length]);  
  35.             length++;   SecondNum = hexchar2int(pchar[length]);  
  36.             if (firstNum == -1 || SecondNum == -1)//判断字符转换成的整数是否有效  
  37.             {  
  38.                 flag = 0;  
  39.                 break;  
  40.             }  
  41.             desStr += char(firstNum<<4) + char(SecondNum);//.append(char(firstNum<<4) + char(SecondNum));  
  42.         }  
  43.         else if(pchar[length]=='+')  
  44.         {  
  45.             desStr +=' ';//.append(' ');//spaceb  
  46.         }  
  47.         //不是特殊字符的urlcode了,即英文字符,直接append到string即可  
  48.         else  
  49.         {  
  50.             desStr +=pchar[length];// .append(pchar[length]);  
  51.         }  
  52.         length ++;  
  53.     }  
  54.     if(flag == 0)  
  55.     {  
  56.         return srcUrl;  
  57.     }  
  58.     return desStr;  
  59. }  
  60. //  
  61. string UrlEncode::HttpUrlEncode(const string& srcUrl)  
  62. {  
  63.     string encodedUrl="";  
  64.     int length = srcUrl.length();  
  65.     if (length == 0)  
  66.     {  
  67.         return encodedUrl;  
  68.     }  
  69.       
  70.     string sDontEncode = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_~.";//  
  71.       
  72.     // Parse a the chars in the url  
  73.     for (int i=0; i<length; i++)  
  74.     {  
  75.           
  76.         char cToFind = srcUrl.at(i);  
  77.           
  78.         if (-1 == sDontEncode.find(cToFind,0))  
  79.         {  
  80.             // Char not found encode it.  
  81.             string tmp = UrlEncodeFormat(cToFind);  
  82.             encodedUrl.append(tmp);  
  83.         }  
  84.         else if(cToFind == ' ')  
  85.         {  
  86.             encodedUrl += '+';//.append('+');  
  87.         }  
  88.         else  
  89.         {  
  90.             encodedUrl += cToFind;//.append(&cToFind,1);  
  91.         }  
  92.     }  
  93.     return encodedUrl;  
  94.       
  95.   
  96. }  
  97. //  
  98. string UrlEncode::UrlEncodeFormat(const unsigned char cValue)  
  99. {  
  100.     string tmp;  
  101.     tmp.append("%");  
  102.     unsigned int nDiv = cValue/16;  
  103.     unsigned int nMod = cValue%16;  
  104.     tmp.append(DecimalToHexString(nDiv));  
  105.     tmp.append(DecimalToHexString(nMod));  
  106.     return tmp;  
  107. }  
  108. //  
  109. string UrlEncode::DecimalToHexString(unsigned int nValue)  
  110. {  
  111.     string tmp;  
  112.     if(nValue<10)  
  113.         tmp+= ((char)nValue +48);//append((int)nValue);  
  114.     else  
  115.     {  
  116.         switch(nValue)  
  117.         {  
  118.                 case 10:tmp.append("A");break;  
  119.                 case 11:tmp.append("B");break;  
  120.                 case 12:tmp.append("C");break;  
  121.                 case 13:tmp.append("D");break;  
  122.                 case 14:tmp.append("E");break;  
  123.                 case 15:tmp.append("F");break;  
  124.                 default:break;  
  125.         }  
  126.     }  
  127.     return tmp;  
  128. }  
  129. /** 
  130.  *将hex字符转换成对应的整数 
  131.  *return 0~15:转换成功,-1:表示c 不是 hexchar 
  132.  */  
  133. int UrlEncode::hexchar2int(char c)  
  134. {  
  135.     if (c >= '0' && c <= '9')  
  136.         return c - '0';  
  137.     else if (c >= 'a' && c <= 'f')  
  138.         return c - 'a' + 10;  
  139.     else if (c >= 'A' && c <= 'F')  
  140.         return c - 'A' + 10;  
  141.     else  
  142.         return -1;  
  143. }  

猜你喜欢

转载自blog.csdn.net/wutiyixin/article/details/24519717
今日推荐