iOS URL编码加号变空格

iOS项目中访问HTTP时需要对URL进行编码,我之前一直使用stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)进行编码,但目前这个方法会有黄色叹号,提示这个方法已经废弃,请使用stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet)这个方法替换,但是我在iOS7的设备上使用这个方法,有几率崩溃,而且是当我的参数字符长度超过一定范围时就会崩溃,但使用stringByAddingPercentEscapesUsingEncoding就不会有这个问题,于是我判断了一下系统版本。
但这样依旧会有一个问题,就是当参数中有英文的加号“+”,这个字符就不会被编码,这样在服务器解码时就有可能把这个加号“+”误认为一个空格,当然还有 一些其他的字符不会被编码,原因是这些字符在URL中有特殊的含义,“%?&”这些,所以我又找到了另外一个方法:
OC:

NSString * param = "!*'();:@&=+$,/?%#[]";

NSString *enString =(NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)param, NULL, NULL, kCFStringEncodingUTF8);

Swift:

let m:CFStringRef! = "!*'();:@&=+$,/?%#[]" as CFStringRef;
let jsonString = CFURLCreateStringByAddingPercentEscapes(nil, jsonString, nil, m, CFStringBuiltInEncodings.UTF8.rawValue) as String;

需要注意的是如果是get请求,你要做的是只对参数进行上面方法的编码,因为这些被编码的字符在URL里有含义。
这样算是暂时解决了问题,但是我觉得苹果推荐使用的方法,可能是我使用的方式不对,NSCharacterSet这个枚举使用哪个能解决加号不会被编码的问题呢,这个有待试验。
之前没有写清楚。。。

后续

在stackoverflow上找到了stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet)正确的使用方法

URLFragmentAllowedCharacterSet  "#%<>[\]^`{|}
URLHostAllowedCharacterSet      "#%/<>?@\^`{|}
URLPasswordAllowedCharacterSet  "#%/:<>?@[\]^`{|}
URLPathAllowedCharacterSet      "#%;<>?[\]^`{|}
URLQueryAllowedCharacterSet     "#%<>[\]^`{|}
URLUserAllowedCharacterSet      "#%/:<>?@[\]^`

这个枚举会编码对应的字符,例如

var originalString = "test/test"
var escapedString = originalString.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet())
println("escapedString: \(escapedString)")

outPut:

test%2Ftest

甚至可以自定义一个编码指定字符的NSCharacterSet对象:

var originalString = "test/test=42"
var customAllowedSet =  NSCharacterSet(charactersInString:"=\"#%/<>?@\\^`{|}").invertedSet
var escapedString = originalString.stringByAddingPercentEncodingWithAllowedCharacters(customAllowedSet)
print("escapedString: \(escapedString)")

输出:

output:test%2Ftest%3D42 
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值