iOS URL编码

前言

前端时间进行报文加密传输改造,碰到了特殊字符和中文乱码问题,后来使用URL编码成功解决(报文传送之前进行URL编码,收到报文之后进行URL解码),记录下,方便以后查看

遇到的问题
  • 解码服务端返回报文是,空格解析成了加号
    • 引起原因
      java中URL编码和iOS中URL编码规范遵循规范不一样(历史原因导致),具体各自遵循什么规范忘记了,也找不到当时是从那看到的了,PS:记住教训,以后看到要及时做好记录
    • 解决方案
      在解码之前手动把“+”替换为“%20”(暂未找到更好的解决方案)
      百度了下,网上也基本都是替换解决的,如:https://www.sojson.com/blog/6.html
    • 疑问:报文中真的有“+”怎么办?
      “+”在进行URL编码时会被处理成“%2B”,所以不用担心报文中真正的“+”被替换成空格,一般情况下空格在URL编码之后会被处理成“%20”
编码实现

说明:编码实现写在字符串分类(category)中

url编码
#pragma mark - URLEncode(URL编码)
/**
 URLEncode(URL编码)

 @return URLEncodeString
 */
- (NSString *)ido_URLEncodedString {
    return [self ido_URLEncodedStringUsingEncoding:NSUTF8StringEncoding];
}

/**
 URLEncode(URL编码)

 @param encoding encoding格式
 @return URLEncodeString
 */
- (NSString *)ido_URLEncodedStringUsingEncoding:(NSStringEncoding)encoding {
    NSString *decodedString = self;

    //NSString *encodedString = [decodedString stringByAddingPercentEscapesUsingEncoding:encoding];
    NSString *encodedString = (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (__bridge CFStringRef)decodedString, NULL, (CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ", CFStringConvertNSStringEncodingToEncoding(encoding));

    return encodedString;
}
url解码
#pragma mark - URLDecode(URL解码)
/**
 URLDecode(URL解码)

 @return URLDecodeString
 */
- (NSString *)ido_URLDecodedString {
    return [self ido_URLDecodedStringUsingEncoding:NSUTF8StringEncoding];
}

/**
 URLDecode(URL解码)

 @param encoding encoding格式
 @return URLDecodeString
 */
- (NSString *)ido_URLDecodedStringUsingEncoding:(NSStringEncoding)encoding {
    NSString *encodedString = self;
    // 处理iOS环境下 " " 被转换为 "+" 问题
    encodedString = [encodedString stringByReplacingOccurrencesOfString:@"+" withString:@"%20"];

    //NSString *decodedString = [encodedString stringByReplacingPercentEscapesUsingEncoding:encoding];
    NSString *decodedString  = (__bridge_transfer NSString *)CFURLCreateStringByReplacingPercentEscapesUsingEncoding(NULL, (__bridge CFStringRef)encodedString, CFSTR(""), CFStringConvertNSStringEncodingToEncoding(encoding));

    return decodedString;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值