美文网首页
工作记录 - URL编码,特殊字符处理

工作记录 - URL编码,特殊字符处理

作者: baiwulong | 来源:发表于2017-12-15 10:35 被阅读19次

问题记录:后台服务器返回一个网络url,客户端点击图片跳转到具体的url,发现某些url跳转不了,后来查看发现使用了这个API进行url编码处理:stringByAddingPercentEscapesUsingEncoding有些问题,
使用了stringByAddingPercentEncodingWithAllowedCharacters来处理就正常了

iOS开发中个,url使用下面的方式来进行编码

推荐

NSString *originalUrl = @"https://www.xingshulin.com我是中文?p1=abc&p2=我是参数2";
NSCharacterSet *encodeUrlSet = [NSCharacterSet URLQueryAllowedCharacterSet];
NSString *encodeUrl = [originalUrl stringByAddingPercentEncodingWithAllowedCharacters:encodeUrlSet];
NSLog(@"%@", encodeUrl);

不推荐这个API

- (nullable NSString *)stringByAddingPercentEscapesUsingEncoding:(NSStringEncoding)enc

与是由于该API已经在iOS9中被苹果废弃,而且1支持的字符比较少,只对`#%^{}[]|"<> 加空格共14个字符编码,不包括&?等符号。

其他方法1

- (void)encodeUrl {
    // p1=%+&sd
    NSString *para1 = [self encodeParameter:@"%+&sd"];
    // p2=我是参数2
    NSString *para2 = [self encodeParameter:@"我是参数2"];
    NSString *encodeUrl = [NSString stringWithFormat:@"https://www.xingshulin.com?p1=%@&p2=%@", para1, para2];
    NSLog(@"%@", encodeUrl);

}

- (NSString *)encodeParameter:(NSString *)originalPara {
    CFStringRef encodeParaCf = CFURLCreateStringByAddingPercentEscapes(NULL, (__bridge CFStringRef)originalPara, NULL, CFSTR("!*'();:@&=+$,/?%#[]"), kCFStringEncodingUTF8);
    NSString *encodePara = (__bridge NSString *)(encodeParaCf);
    CFRelease(encodeParaCf);
    return encodePara;
}

结果:https://www.xingshulin.com?p1=%25%2B%26sd&p2=%E6%88%91%E6%98%AF%E5%8F%82%E6%95%B02

除了中文正常转码外,特殊字符只要包含在!*'();:@&=+$,/?%#[]这些字符范围内的都进行了转码。

为什么要进行URL编码

我们都知道Http协议中参数的传输是"key=value"这种简直对形式的,如果要传多个参数就需要用“&”符号对键值对进行分割。如"?name1=value1&name2=value2",这样在服务端在收到这种字符串的时候,会用“&”分割出每一个参数,然后再用“=”来分割出参数值。

针对“name1=value1&name2=value2”我们来说一下客户端到服务端的概念上解析过程:

上述字符串在计算机中用ASCII吗表示为:
6E616D6531 3D 76616C756531 26 6E616D6532 3D 76616C756532。
6E616D6531:name1
3D:=
76616C756531:value1
26:&
6E616D6532:name2
3D:=
76616C756532:value2

服务端在接收到该数据后就可以遍历该字节流,首先一个字节一个字节的吃,当吃到3D这字节后,服务端就知道前面吃得字节表示一个key,再想后吃,如果遇到26,说明从刚才吃的3D到26子节之间的是上一个key的value,以此类推就可以解析出客户端传过来的参数。

现在有这样一个问题,如果我的参数值中就包含=或&这种特殊字符的时候该怎么办

比如说“name1=value1”,其中value1的值是“va&lu=e1”字符串,那么实际在传输过程中就会变成这样“name1=va&lu=e1”。我们的本意是就只有一个键值对,但是服务端会解析成两个键值对,这样就产生了奇异。

如何解决上述问题带来的歧义呢?解决的办法就是对参数进行URL编码

URL编码只是简单的在特殊字符的各个字节前加上%,例如,我们对上述会产生奇异的字符进行URL编码后结果:“name1=va%26lu%3D”,这样服务端会把紧跟在“%”后的字节当成普通的字节,就是不会把它当成各个参数或键值对的分隔符。

另外一个问题,就是为什么我们要用ASCII传输,可不可以用别的编码

当然可以用别的编码,你自己可以开发一套编码,然后自己解析。就像大部分国家都有自己的语言一样。那国家之间要交流,怎么办? 用英语把,英语的使用范围最广。

参考
http://blog.csdn.net/andanlan/article/details/53368727 (建议看一下)
https://www.cnblogs.com/jerrysion/p/5522673.html

相关文章

  • Foundation - NSCharacterSet

    我目前使用过的场景: 1、可以用来处理url上的特殊字符工作记录 - URL编码,特殊字符处理2、可以用来限制文本...

  • 工作记录 - URL编码,特殊字符处理

    问题记录:后台服务器返回一个网络url,客户端点击图片跳转到具体的url,发现某些url跳转不了,后来查看发现使用...

  • 网址URL中特殊字符转义编码

    网址URL中特殊字符转义编码字符 - URL编码值 URL特殊字符转义,URL中一些字符的特殊含义,基...

  • iOS 字符串含有特殊字符,转换URL为空值

    网络请求的url含有特殊字符时字符串需要编码处理 比如:url:http://demo.demo.com/demo...

  • (十二)Dart网络编程

    一、Uri Uri 类 提供了 编码和解码 URI(URL) 字符的功能。 这些函数处理 URI 特殊的字符,例如...

  • url编码

    为什么要进行URL编码 编码是对url中的中文和特殊符号进行编码。对url编码其实就是对一些特殊字符进行使用utf...

  • WKWebView 小记

    WKWebView 不支持点击处理电话,邮件等格式化的URL,暂时记录下简单的webView处理 URL 特殊字符...

  • URL原理、URL编码、URL特殊字符

    转载———— 通常如果一样东西需要编码,说明这样东西并不适合传输。原因多种多样,如Size过大,包含隐私数据,对于...

  • ios随笔学习之HTTP基础

    一、URL的编码 URL中一旦出现了特殊字符(比如中文、空格),需要进行编码。比如: 0、URL的组成?参考iOS...

  • NSCharacterSet

    学会NSCharacterSet,再也不怕各种字符串处理!!url出现特殊字符处理-- stringByAddin...

网友评论

      本文标题:工作记录 - URL编码,特殊字符处理

      本文链接:https://www.haomeiwen.com/subject/nfyrwxtx.html