当前位置: > > > Swift - 实现URL字符串的编码与解码(urlEncoded、urlDecoded)

Swift - 实现URL字符串的编码与解码(urlEncoded、urlDecoded)

我们的应用中常常需要发起 HTTP 网络请求,如果拼接的 URL 地址中包含有中文、空格、特殊符号时,我们就要对其转义。否则就会无法正确访问。


1,扩展String,添加相关的转义方法

Swift3 新增的 addingPercentEncoding 方法实现了编码的功能,也就是将指定的字符集使用“%”代替。这里为方便使用,我们扩展 String,为其添加两个新方法:
  • urlEncoded():将原始的 url 编码为合法的 url
  • urlDecoded():将编码后的 url 转换回原始的 url
extension String {
    
	//将原始的url编码为合法的url
	func urlEncoded() -> String {
        let encodeUrlString = self.addingPercentEncoding(withAllowedCharacters:
            .urlQueryAllowed)
		return encodeUrlString ?? ""
	}
	
    //将编码后的url转换回原始的url
	func urlDecoded() -> String {
		return self.removingPercentEncoding ?? ""
	}
}

2,使用样例

let urlStr = "http://hanggge.com?name=航歌&key=!*'();:@&=+$,/?%#[]"
print("转义后的url:\(urlStr.urlEncoded())")
print("还原后的url:\(urlStr.urlEncoded().urlDecoded())")
运行结果如下:
评论2
  • 2楼
    2018-09-20 15:45
    one

    感谢您的回复,链接是后台返回的,有的链接里面有中文,有的是你说的已经转义过的,我现在的做法是先解码再编码,不知道这样会不会有问题?

    站长回复

    不管这个链接是不是已经转义过的,一律先解码再编码,通常是不会出问题的。

  • 1楼
    2018-09-03 16:06
    one

    航哥你好,用urlEncoded编码,如果链接里面有%会导致链接打不开
    转义前:http://file.ubye.cn/UbyeBackgroundFiles/img/package_sweep_server/2018081616474824fuwuqian%20(1).png
    转义后:http://file.ubye.cn/UbyeBackgroundFiles/img/package_sweep_server/2018081616474824fuwuqian%2520(1).png

    站长回复

    你上面的那个链接其实已经是转义后的了,不需要再转义(最原始的应该是 http://file.ubye.cn/UbyeBackgroundFiles/img/package_sweep_server/2018081616474824fuwuqian (1).png),其中空格被转义成%20。
    如果再次对它转义就变成二次转义,自然会出问题。