URL编码

本文详细解析了iOS中使用CFURLCreateStringByAddingPercentEscapes方法进行URL编码的过程,包括其参数作用、转义规则以及解决特殊URL编码问题的方法。通过实例演示,帮助开发者更好地理解和应用这一API,确保URL的正确性和安全性。

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

iOS url编码

CFURLCreateStringByAddingPercentEscapes 方法解释

CFStringRef CFURLCreateStringByAddingPercentEscapes(CFAllocatorRef allocator, CFStringRef originalString, CFStringRef charactersToLeaveUnescaped, CFStringRef legalURLCharactersToBeEscaped, CFStringEncoding encoding);

注释:
参数:
1. allocator: 表示为返回字符串申请内存空间,如果传入NULL或者kCFAllocatorDefault ,表示使用默认的内存分配
2. originalString: 要转义的字符串
3. charactersToLeaveUnescaped:保留字符,这些字符不要转义
4. legalURLCharactersToBeEscaped:可以被转义的字符
5. encoding :转义规则中的编码方式。如果encoding不同,转出来的东西就不一样
返回值:这个方法返回一个转义之后的url

思考:
1. 到底哪些字符需要编码,哪些字符忽略不需要编码?
基于RFC 3986规则,规定的所有非法字符 加上legalURLCharactersToBeEscaped 定义的字符 减掉 charactersToLeaveUnescaped定义的字符
最后这个字符集就是要进行转义的字符集。

所以如果legalURLCharactersToBeEscaped,charactersToLeaveUnescaped 都传入NULL. 表明要转义的字符集就是RFC3986规定的哪些。
2. 如果一个url里面有一部分字符串经过了转义,一部分字符串没有经过转义怎么办?
如下:
http://online.store.com/storefront/?request=get-document&doi=10.1175%2F1520-0426(2005)014%3C1157:DODADSS%3E2.0.CO%3B2
这个url. 如果再直接用CFURLCreateStringByAddingPercentEscapes 会有问题。 一些字符被转义了两次了。

解决方法:先用
CFURLCreateStringByReplacingPercentEscapesUsingEncoding预处理把它恢复到普通字符串,再用CFURLCreateStringByAddingPercentEscapes 编码。参考苹果官方代码

CFStringRef originalURLString = CFSTR("http://online.store.com/storefront/?request=get-document&doi=10.1175%2F1520-0426(2005)014%3C1157:DODADSS%3E2.0.CO%3B2");
CFStringRef preprocessedString =
    CFURLCreateStringByReplacingPercentEscapesUsingEncoding(kCFAllocatorDefault, originalURLString, CFSTR(""), kCFStringEncodingUTF8);
CFStringRef urlString =
    CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, preprocessedString, NULL, NULL, kCFStringEncodingUTF8);
url = CFURLCreateWithString(kCFAllocatorDefault, urlString, NULL);

注:解释下CFURLCreateStringByReplacingPercentEscapesUsingEncoding的charactersToLeaveEscaped的参数,类似,它如果传入NULL则任何转义字符都不要变,传入指定字符就是指定字符都不要变,传入CFSTR(“”)则任何字符都要变。(可以参考苹果官方文档)

### URL编码的使用方法及规则 URL编码(Percent-Encoding)是一种用于在URL中传输特殊字符的编码方式。由于URL只能使用有限的字符集(主要是ASCII字符),而实际应用中可能包含许多特殊字符(如空格、中文字符、标点符号等),URL编码通过将这些特殊字符转换为可传输的格式,确保了URL的正确性和安全性[^1]。 #### 编码规则 URL编码遵循以下规则: 1. 非字母数字字符会被替换为 `%` 后跟两个表示字符ASCII值的十六进制数字。例如,空格会被编码为 `%20`。 2. 某些保留字符(如 `&`, `=`, `?` 等)即使属于ASCII字符集,也会被编码以避免歧义。例如,`&` 会被编码为 `%26`。 3. 对于非ASCII字符(如中文字符),通常先将其转换为UTF-8字节序列,然后对每个字节进行百分号编码。例如,中文字符“你好”在UTF-8编码下会被转换为 `%E4%BD%A0%E5%A5%BD`[^2]。 #### 使用方法 URL编码广泛应用于以下场景: 1. **URI/URL**:当需要在URL中传递参数时,所有特殊字符都需要进行URL编码[^3]。 2. **表单提交**:当浏览器提交表单时,会根据请求体格式 `application/x-www-form-urlencoded` 对表单数据进行编码。具体规则如下: - 每对 `name/value` 参数由 `&` 符号分隔。 - 每个 `name` 和对应的 `value` 由 `=` 符号分隔。 - 如果用户没有输入值给某个 `name`,则该 `name` 仍会出现,但无值[^4]。 #### 示例代码 以下是一个简单的Python示例,展示如何对字符串进行URL编码: ```python import urllib.parse # 原始字符串 original_string = "Hello, 你好! This is a test." # 使用urllib库进行URL编码 encoded_string = urllib.parse.quote(original_string) print("原始字符串:", original_string) print("URL编码后的字符串:", encoded_string) ``` 运行结果: ``` 原始字符串: Hello, 你好! This is a test. URL编码后的字符串: Hello%2C+%E4%BD%A0%E5%A5%BD%21+This+is+a+test. ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值