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

-------------------------------------------欢迎查看字符编码【专栏】------------------------------------------
汉字编码之GBK编码【点击】                                              判断汉字正则表达式更严谨方法【点击
记事本输入“联通”俩字,关闭再打开乱码 【点击】              iPhone emoji问题牵出的Unicode代理区的思考【点击
Unicdoe【真正的完整码表】对照表【点击】                      开源工程ZipArchive,压缩中文文件名乱码问题【点击
base64加密,解密,encode,decode,编码详解+实现【点击】 
网络传输文本,urlEncode和urldecode的iOS实现【点击】 字符编码的奥秘utf-8, Unicode【点击
----------------------------------------------------------------------------------------------------------------

url Encode和Decode的实现

源码下载地址(vs2005版本):http://download.csdn.net/detail/hherima/5108862
也可以下载源码(ios版本):http://download.csdn.net/detail/hherima/5108862
根据RFC 3986 section 2.2 保留字符 (2005年1月)下面18个字符需要urlencode
!*'();:@&=+$,/?#[]

更详细哪些字符是需要转化的呢:

1. ASCII 的控制字符
        这些字符都是不可打印的,自然需要进行转化。
2. 一些非ASCII字符
        这些字符自然是非法的字符范围。转化也是理所当然的了。
3. 一些保留字符
        很明显最常见的就是“&”了,这个如果出现在url中了,那你认为是url中的一个字符呢,还是特殊的参数分割用的呢?
4. 就是一些不安全的字符了
Http协议中参数的传输是"key=value"这种简直对形式的,如果要传多个参数就需要用“&”符号对键值对进行分割。如"?name1=value1&name2=value2"
如果我的参数值中就包含=或&这种特殊字符的时候该怎么办?这时候就要用到urlEncode/Decode。

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

头文件

 

using namespace std;
#include <string.h>
#include <iostream>

class UrlEncode
{
public:
    NSString* Encode(NSString*src);
    NSString* Decode(NSString* src);
private:
    string HttpUrlDecode(const string& srcUrl);
    string HttpUrlEncode(const string& srcUrl);
    int hexchar2int(char c);
    string UrlEncodeFormat(const unsigned char cValue);
    string DecimalToHexString(unsigned int nValue);

};

源文件

 

 

#include "UrlEncode.h"

NSString* UrlEncode::Encode(NSString*src)
{
    string buf = HttpUrlEncode([src UTF8String]);
    return [NSString stringWithUTF8String:buf.c_str()];
}
//
NSString* UrlEncode::Decode(NSString* src)
{
    string buf = HttpUrlDecode([src UTF8String]);
    return [NSString stringWithUTF8String:buf.c_str()];
}
//
string UrlEncode::HttpUrlDecode(const string& srcUrl)
{
    string   desStr;
	int length = 0;
	int flag      =1;
	unsigned char firstNum  = 0;
	unsigned char SecondNum = 0;
	const char * pchar = srcUrl.c_str();//.Ptr();
	while(length < srcUrl.length())
	{
		if(pchar[length]=='%')//&& length < srcUrl.length()-2
		{
			//最后一位,need break;
			if(length == srcUrl.length()-1)
			{
				desStr +=pchar[length];//.append(pchar[length]);
				break;
			}
			//正常移位
			length++;	firstNum = hexchar2int(pchar[length]);
			length++;	SecondNum = hexchar2int(pchar[length]);
            if (firstNum == -1 || SecondNum == -1)//判断字符转换成的整数是否有效
            {
                flag = 0;
                break;
            }
			desStr += char(firstNum<<4) + char(SecondNum);//.append(char(firstNum<<4) + char(SecondNum));
		}
		else if(pchar[length]=='+')
		{
			desStr +=' ';//.append(' ');//spaceb
		}
		//不是特殊字符的urlcode了,即英文字符,直接append到string即可
		else
		{
			desStr +=pchar[length];// .append(pchar[length]);
		}
		length ++;
	}
	if(flag == 0)
	{
		return srcUrl;
	}
	return desStr;
}
//
string UrlEncode::HttpUrlEncode(const string& srcUrl)
{
    string encodedUrl="";
    int length = srcUrl.length();
	if (length == 0)
	{
		return encodedUrl;
	}
	
	string sDontEncode = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_~.";//
    
	// Parse a the chars in the url
	for (int i=0; i<length; i++)
	{
        
		char cToFind = srcUrl.at(i);
        
		if (-1 == sDontEncode.find(cToFind,0))
		{
			// Char not found encode it.
			string tmp = UrlEncodeFormat(cToFind);
			encodedUrl.append(tmp);
		}
		else if(cToFind == ' ')
		{
			encodedUrl += '+';//.append('+');
		}
		else
		{
			encodedUrl += cToFind;//.append(&cToFind,1);
		}
	}
	return encodedUrl;
    

}
//
string UrlEncode::UrlEncodeFormat(const unsigned char cValue)
{
    string tmp;
	tmp.append("%");
	unsigned int nDiv = cValue/16;
	unsigned int nMod = cValue%16;
	tmp.append(DecimalToHexString(nDiv));
	tmp.append(DecimalToHexString(nMod));
	return tmp;
}
//
string UrlEncode::DecimalToHexString(unsigned int nValue)
{
  	string tmp;
	if(nValue<10)
		tmp+= ((char)nValue +48);//append((int)nValue);
	else
	{
		switch(nValue)
		{
                case 10:tmp.append("A");break;
                case 11:tmp.append("B");break;
                case 12:tmp.append("C");break;
                case 13:tmp.append("D");break;
                case 14:tmp.append("E");break;
                case 15:tmp.append("F");break;
                default:break;
		}
	}
	return tmp;
}
/**
 *将hex字符转换成对应的整数
 *return 0~15:转换成功,-1:表示c 不是 hexchar
 */
int UrlEncode::hexchar2int(char c)
{
    if (c >= '0' && c <= '9')
        return c - '0';
    else if (c >= 'a' && c <= 'f')
        return c - 'a' + 10;
    else if (c >= 'A' && c <= 'F')
        return c - 'A' + 10;
    else
        return -1;
}

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Python中的`urlencode`和`urldecode`是用于处理URL编码和解码的方法。 `urlencode`方法用于将一个字典形式的参数列表转换为URL编码的字符串。例如,假设有一个字典`params`包含以下键值对: ``` params = {"name": "张三", "age": 20, "city": "北京"} ``` 使用`urlencode`方法将字典转换为URL编码的字符串: ``` import urllib.parse url_encoded = urllib.parse.urlencode(params) print(url_encoded) ``` 输出结果为: ``` name=%E5%BC%A0%E4%B8%89&age=20&city=%E5%8C%97%E4%BA%AC ``` `urldecode`方法用于将URL编码的字符串解码为字典形式的参数列表。例如,将上面的URL编码字符串解码为字典: ```python import urllib.parse url_decoded = urllib.parse.parse_qs(url_encoded) print(url_decoded) ``` 输出结果为: ``` {'name': ['张三'], 'age': ['20'], 'city': ['北京']} ``` 可以通过访问字典的键来获取对应的值: ```python name = url_decoded['name'][0] age = url_decoded['age'][0] city = url_decoded['city'][0] print(f"姓名:{name},年龄:{age},城市:{city}") ``` 输出结果: ``` 姓名:张三,年龄:20,城市:北京 ``` 通过这两个方法,我们可以方便地进行URL编码和解码的操作,以便于在HTTP请求或其他URL相关的场景中使用。 ### 回答2: Python中的urlencode方法是将字典数据编码为URL参数的字符串。它将字典键值对转换为一组key=value对,并用&符号链接起来。这通常用于构建GET请求的URL参数部分。 例如,将以下字典数据编码为URL参数字符串: ``` params = {'name': '张三', 'age': 20, 'city': '北京'} ``` 通过使用urlencode方法,我们可以得到如下结果: ``` encoded_params = urllib.parse.urlencode(params) print(encoded_params) ``` 输出结果为:name=%E5%BC%A0%E4%B8%89&age=20&city=%E5%8C%97%E4%BA%AC urldecode的功能与urlencode相反,它用于将URL参数字符串解码为字典数据。例如,将上面编码后的字符串解码为字典数据: ``` decoded_params = urllib.parse.parse_qs(encoded_params) print(decoded_params) ``` 输出结果为:{'name': ['张三'], 'age': ['20'], 'city': ['北京']} 注意,这里使用了urllib.parse模块来进行编码和解码。在Python 3中,urllib模块已经被拆分为多个子模块,其中urllib.parse包含了URL编码和解码相关的功能。 综上所述,Python中的urlencodeurldecode方法提供了方便的对URL参数进行编码和解码的功能,可以用于构建和解析GET请求的URL参数部分。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值