URL Decode中对于+号的处理 / 2018-12-09

如果你的产品包含iOS AndroidAPP以及后台服务,你很可能遇到一个加号 decode 后的问题。

iOS和Android系统URL Decode API在处理+号时有区别。

举个例子,原始数据:

H+ZPXNt8%2F7OvQLAAD%2F%2Fw==

Android:URLDecoder.decode(string, "utf-8")结果是:

H ZPXNt8/7OvQLAAD//w==

而iOS stringByRemovingPercentEncoding结果是:

H+ZPXNt8/7OvQLAAD//w==

两个结果的区别就在于 Android 将+号decode成空格,而 iOS 将+号decode成+号。

easeapi经过一番搜索之后,没有找到特别优雅的处理方式,一般的处理都是先将+号替换成空格,然后再decode:

NSString *preResult = [src stringByReplacingOccurrencesOfString:@"+" withString:@" "];

NSString *result = [preResult stringByRemovingPercentEncoding];

如果原数据中包含+号,经过替换之后就出错了?

不是的,这就需要保证+号要经过encode,encode之后是%2b

NSCharacterSet *set = [[NSCharacterSet characterSetWithCharactersInString:@"!*'();:@&=+$,/?%#[] "] invertedSet];

NSString *value = [@"+" stringByAddingPercentEncodingWithAllowedCharacters:set];

保证stringByAddingPercentEncodingWithAllowedCharacters中配置了+号。

其它文章

UTF-8 BOM EF BB BF 问题
iOS 64/32位系统在处理BOOL值时的区别