为什么使用URLEncode?

289 阅读2分钟

首先Url是有规范的,并不是所有的字符都可以放在里面,哪些特殊字符不能直接放在url中呢?

  1. ASCII的控制字符 这些字符都是不可打印的,自然需要进行转义。

  2. 一些特殊字符 例如:emoji字符👴🏻👮🏽。特殊字符需要被转转义也是理所当然的。

  3. 与url分隔字符相同的字符

url中的分隔符包含主要分隔符:#[]@?/和次要分隔符!$&'()*+,;=。 url的query参数和值,如果在分隔符的包含范围内,除了?和/外,都需要转义。例如:对于原始urlhttps://www.baidu.com?paramA=哈哈&paramB=&来说,哈哈和paramB=&中的&就需要参与转义。哈哈是中文,所以需要转义。&在分隔符的包含范围内,所以也需要转义。如果不进行转义,后端收到后,会认为它是一个参数值,还是url本身的分隔符呢?

  1. 一些不安全的字符 例如:空格。为了避免歧义,需要被转化成+或者%20。具体转换成+还是%20主要依据不同的转换标准。

  2. 中文 6.参数又是一个url 的情况

总结这些字符也是为了不让Url使用时出问题,如果不做任何处理,传输可能会出错。

前五种需要对整个URL进行URLEncode 而第六种只需要对对参数进行URLEncode.

URLEncode的注意事项:

http%3A%2F%2F192.168.1.201%3A30256%2FfieldInfor%3Fid%3D28%26index%3D2%26serialNumber%3D3

像上面这种被URLEncode 的URL 放到浏览器无法直接访问,需要将进行URLDecode进行解码

但是下面的这种是可以直接在浏览器访问的

http://192.168.1.201:30255/app/news/news.html?id=872&title=%E5%A4%AB%E5%A3%AB%E5%A4%A7%E5%A4%AB%E5%8D%81%E5%88%86%E4%B8%8A%E7%94%B5%E9%A3%8E%E5%A3%AB%E5%A4%A7%E5%A4%AB%E5%B1%B1%E8%B1%86%E6%A0%B9%E5%9C%B0%E6%96%B9%E7%BB%99%E5%AF%B9%E6%96%B9%E6%B3%95%E7%9A%84%E8%A7%84%E5%AE%9A%E5%9C%B0%E6%96%B9%E7%9A%84%E5%9C%B0%E6%96%B9%E7%9A%84%E7%BB%99%E8%B1%86%E8%85%90%E5%B9%B2%E5%A4%A7%E6%A6%82%E5%9C%B0%E6%96%B9%E7%BB%99%E5%A4%A7%E6%A6%82%E8%B1%86%E8%85%90%E5%B9%B2%E7%9A%84%E5%88%9A%E5%88%9A%E7%9A%84%E9%A3%8E%E6%A0%BC&isOut=0&v=1&accountId=438670

ios 对URL 进行编码

NSCharacterSet *encodeUrlSet = [NSCharacterSet URLQueryAllowedCharacterSet];
NSString *encodeUrl = [urlString stringByAddingPercentEncodingWithAllowedCharacters:encodeUrlSet]

我们一般拿到服务端一个URL,先进行encode,这样可能会存在一个问题,有可能之前的url 已经被encode过一次,这样相当于对URL进行了多次的encode,不论我们对url 进行了多少次encode,我们把这个被多次encode,不论是在浏览器里面,或者利用WKWebView 都可以直接使用这个url打开界面。本地都是浏览器会帮我们自动进行decode,如果我们需要对一个url进行decode(可能被多次encode),我们应该怎么做呢?看下面的代码

思路很简单,就是对这个url递归使用 decode,什么时间可以判断decode完成了,可以通过判断 decode的和没decode是一样的,说明我们已经被url进行了完全的decode

- (NSString *)URLUTF8DecodingString {

    if (self.length == 0) {

        return self;

    }

    if ([self stringByRemovingPercentEncoding] == nil

        || [self isEqualToString:[self stringByRemovingPercentEncoding]]) {

        return self;

    }

    NSString *decodedStr = [self stringByRemovingPercentEncoding];

    return [decodedStr URLUTF8DecodingString];

}