iOS-URL编解码

本文介绍了iOS中URL编码解码的重要性,特别是在处理包含特殊字符和中文的参数时。详细讨论了URL可以包含的字符、需要编码的字符,并提供了两种编码方法,强调了编码过程中需要注意的内存管理和特殊字符处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

##URL编解码

前言:

一般在请求的时候参数中带有中文的时候经常会用到一个编码方法:

stringByAddingPercentEscapesUsingEncoding

相比大家都比较熟悉 用UTF-8进行编码,但是在项目中遇到webView拦截url来做交互的时候(JS OC 交互 协议截取 URL截取 以及注入的笨方法…)发现有一些特殊字符解码过程会出现问题.于是有了下边的一些探讨和学习.

为啥用到编码?
1.Size过大
2.包含隐私数据
3.URL本身而言,歧义...

对于最后一种比较常见,例如服务器通过截取& = 来区分你的key 和value.一旦你的参数中包含了&=则就会分割错误引起歧义从而需要编码.

URL可以包含那些字符?

PFC3086(个人也不清楚是个啥..应该是个标准) 规定URL只能包含:
a – > z
A – > Z
- _ . ~ 四个特殊字符
! * ‘ ( ) : ; @ & = + $ , / ? # [ ] 18个保留字符

需要编码的字符有哪些?

空格 <> % # { } | \ [ ] ’ ~ 不安全字符
以及其他特殊字符(这些字符往往在URL里有自己特有的意义)

URL编解码

说明:
URL编码又叫做百分号编码 百分号 + ASCII(因为是英文最普遍) 
ASCII 的不可用范围  10 - 7F(控制字符)  80 - FF(超出字节字符)
对于ASCII 以及中文非ASCII字符需要ASCII超集编码这里就不赘述了 
主要讲iOS中遇到的一些方法.
方法一
stringByAddingPercentEscapesUsingEncoding : //--utf-8
//只对` # % ^ { } [ ] | \ " < > 和空格 进行了编码,对于 ? & 这种并没有进行编码
方法二
CFURLCreateStringByAddingPercentEscapes("参数1","参数2","参数3","参数4","参数5");
//首先返回一个CFStringRef
//参数3 不转义字符 参数4 指定转义字符

具体参数解释 :
第一个参数是AllocatorRef –>内存分配类型(内存分配器下一节说明)
第二个参数是CFStringRef –>待转码字符串
第三个参数是CFStringRef –>不转义字符
第三个参数是CFStringRef –>指定转义字符
第三个参数是CFStringEncoding –>编码类型 KCFStringEncodingUTF8
这种方法有内存泄漏一定要释放:CFRelease(CFStringRef)
PS:CFBridgingRelease(CFStringRef) 释放掉CFStringRef 并且转化为NSString;
一般的操作

CFStringRef cfstring= CFURLCreateStringByAddingPercentEscapes(KCFAllocatorDefault,(CFStringRef)self,NULL,(CFStringRef)@"!$&'()*+,-./:;=?@_~%#[]",KCFStringEncodingUTF8);
NSString *string = CFBridgingRelease(CFStringRef);

解码简单一提.基本相似:
方法是:CFURLCreateStringByReplacingPercentEscapesUsingEncoding(…)

 NSString *decodedString=(__bridge_transfer NSString *)CFURLCreateStringByReplacingPercentEscapesUsingEncoding(NULL, (__bridge CFStringRef)self, CFSTR(""), CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding));

这里看到内存泄漏的解决办法不一样一个是CFBridgingRelease 一个是直接(__bridge_transfer ) 下下一节会解释

如有问题请指正!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值