重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
Http协议中参数的传递是通过键值对"key=value"形式来进行,多参数之间使用“”符号对键值对进行拼接,如:"?key1=value1key2=value2"。而服务端对URL的解析,也是以“”分割出每个参数键值对,以“=”分割每个键值对中的键和值,一个字节一个字节对URL字节流进行处理的。
正安ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为成都创新互联公司的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:028-86922220(备注:SSL证书合作)期待与您的合作!
上述的解析会产生一个问题:如果参数的值本身就带有“”,“=”这种特殊字符怎么办?这就是进行URL编码的原因所在。URL编码原理只是在特殊字符的各个字节前加上%,这里说的特殊字符不仅仅只是“=”和“”,而且还有保留字符、不安全字符以及非ASCII码字符,下面会详细解析。
既然是编码,自然就会用到字符集,就像解析密码需要密码本一样。URL编码默认使用的字符集是US-ASCII,所以对于URL编码,最准确的定义应该是: 百分号(%)加上该字节对应的两位US-ASCII字符(由0123456789ABCDEF组成,代表该字节的十六进制形式) 。那么,什么情况下需要对字节进行编码呢,还是说所有字节都需要编码?对于URL中的合法字符,编码和不编码是等价的,也就是说,假如参数为:key1=url,这种情况下编码与不编码是一样的,进而言之,只有对保留字符、不安全字符以及非ASCII码字符进行的URL编码才有实际的意义。
中文编码系统自带的方法。如下
NSString* encodedString = [urlStringstringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
【作者前言】:13年入圈,分享些本人工作中遇到的点点滴滴那些事儿,17年刚开始写博客,高手勿喷!以分享交流为主,欢迎各路豪杰点评改进!
链接分享场景非常之多,为了更好的保护一些数据信息,需要我们进行一些编解码处理
这里为了能够跟Web互通,整理了一下。
跨平台url数据编解码互通, 保护数据信息安全性
① url encodeURIComponent 编码
② URL decodeURIComponent 解码
// 我们一般用这个方法处理stringByAddingPercentEscapesUsingEncoding但是这个方法好想不会处理/和这种特殊符号,这种情况就需要用下边这个方法处理
@implementationNSString (NSString_Extended)
- (NSString*)urlencode {
NSMutableString *output = [NSMutableString string];
const unsigned char *source = (const unsigned char *)[self UTF8String];
intsourceLen =strlen((constchar*)source);
for(inti =0; i sourceLen; ++i) {
constunsignedcharthisChar = source[i];
if(thisChar ==' '){
[outputappendString:@"+"];
}elseif(thisChar =='.'|| thisChar =='-'|| thisChar =='_'|| thisChar =='~'||
(thisChar ='a' thisChar ='z') ||
(thisChar ='A' thisChar ='Z') ||
(thisChar ='0' thisChar ='9')) {
[outputappendFormat:@"%c", thisChar];
}else{
[outputappendFormat:@"%%%02X", thisChar];
}
}
returnoutput;
}
统一资源定位符 (英语:Uniform Resource Locator,常缩写为URL),俗称网址。
如同在网络上的门牌,是因特网上标准的资源的地址(Address)。
相关定义:
URI,是uniform resource identifier,统一资源标识符,用来唯一的标识一个资源。
URN,uniform resource name,统一资源命名,是通过名字来标识资源,比如mailto:java-net@java.sun.com。
统一资源定位符的标准格式如下:
统一资源定位符的完整格式如下:
超文本传输协议([HTTP])的统一资源定位符将从因特网获取信息的五个基本元素包括在一个简单的地址中:
1. 传送协议。Data URI scheme
2. 层级URL标记符号(为[//],固定不变)
3. 访问资源需要的凭证信息(可省略)
4. 服务器。(通常为域名,有时为IP地址)
5. 端口号。(以数字方式表示,若为HTTP的默认值“:80”可省略)
6. 路径。(以“/”字符区别路径中的每一个目录名称)
7. 查询。(GET模式的窗体参数,以“?”字符为起点,每个参数以“”隔开,再以“=”分开参数名称与数据,通常以UTF8的URL编码,避开字符冲突的问题)
8. 锚点、片段。以“#”字符为起点
iOS的URL属性对应的部分总览:
现在以下面的URL为例,讲解一下组成部分以及iOS所对应的属性
从上面的URL可以看出,一个完整的URL包括以下几部分:
1. 协议部分( Scheme ):该URL的协议部分为“http:”,这代表网页使用的是HTTP协议。在Internet中可以使用多种协议,如HTTP,FTP,HTTPS等等本例中使用的是HTTP协议。在"HTTP"后面的“//”为分隔符
2. 域名部分:该URL的域名部分为“”。一个URL中,也可以使用IP地址作为域名使用(如:10.20.1.2)
3. 端口部分:跟在域名后面的是端口,域名和端口之间使用“:”作为分隔符。端口不是一个URL必须的部分,如果省略端口部分,将采用默认端口
4. 虚拟目录部分:从域名后的第一个“/”开始到最后一个“/”为止,是虚拟目录部分。虚拟目录也不是一个URL必须的部分。本例中的虚拟目录是“/trip/”
文件名部分:从域名后的最后一个“/”开始到“?”为止,是文件名部分,如果没有“?”,则是从域名后的最后一个“/”开始到“#”为止,是文件部分,如果没有“?”和“#”,那么从域名后的最后一个“/”开始到结束,都是文件名部分。本例中的文件名是“index.asp”。文件名部分也不是一个URL必须的部分,如果省略该部分,则使用默认的文件名
iOS中并没有区分虚拟目录和文件名,而是统一处理
5. 锚部分:从“#”开始到最后,都是锚部分。本例中的锚部分是“name”。锚部分也不是一个URL必须的部分
6. 参数部分:从“?”开始到“#”为止之间的部分为参数部分,又称搜索部分、查询部分。本例中的参数部分为“boardID=5ID=24618page=1”。参数可以允许有多个参数,参数与参数之间用“”作为分隔符。
注意:#代表网页中的一个位置。其右面的字符,就是该位置的标识符。
#是用来指导浏览器动作的,对服务器端完全无用。所以,HTTP请求中不包括#。
iOS开发过程中有很多的编码,最近使用了urlencode编码,使用这个编码的主要作用是解决url中出现中文或者特殊字符在网络传输过程中出现的乱码.
实际上是第一步先创建要转义的字符集合,.然后再使用
stringByAddingPercentEncodingWithAllowedCharacters方法进行转义.
字符串nickname就是通过urlencode转义之后的字符.
invertedSet 这个设置是必须要用的,不然转义set集合不会起到作用.
这是打印的hString2的urlencode之后的值,显而易见,这是转换成功的.