只为此心无垠

A blog for Jekyll

凤凰花开开两季,之余青春止于青春


Download the theme

Encode URL Data

编码URL数据

URL编码字符串,使用Core Foundation 函数的CFURLCreateStringByAddingPercentEscapesCFURLCreateStringByReplacingPercentEscapesUsingEncoding。这些函数允许编码您指定的字符列表,除了高ASCII编码(0x800xff)和非打印字符。

根据RFC 3986,在URL中的保留字符有:

reserved    = gen-delims / sub-delims
 
gen-delims  = ":" / "/" / "?" / "#" / "[" / "]" / "@"
 
sub-delims  = "!" / "$" / "&" / "'" / "(" / ")"
                  / "*" / "+" / "," / ";" / "="

因此,要正确URL编码一个UTF-8字符串时,你应该做到以下几点:

CFStringRef originalString = ...
 
CFStringRef encodedString = CFURLCreateStringByAddingPercentEscapes(
    kCFAllocatorDefault,
    originalString,
    NULL,
    CFSTR(":/?#[]@!$&'()*+,;="),
    kCFStringEncodingUTF8);

如果要解码一个URL片段,您必须首先将URL字符串分割成几个组成部分(领域和路径的部分)。如果不对其进行解码,您将无法分清其中差异,例如,一个编码了的&符号(原来是一个字段的内容的一部分)和一个光秃秃的&符号(表明领域的结束)。

你已经打破了URL成各个片段,您可以按以下各部分进行解码:

CFStringRef decodedString = CFURLCreateStringByReplacingPercentEscapesUsingEncoding(
    kCFAllocatorDefault,
    encodedString,
    CFSTR(""),
    kCFStringEncodingUTF8);

要点:虽然NSString类提供了用于添加百分比编码方法,但不应该常常使用它们。 这些方法假定您传递的字符串包含一系列&字符分隔的值,因此,您不能对包含&符的字符串进行正确的URL编码。 如果你尝试使用这些方法做某事,你的代码可能容易受到URL字符串注入攻击(安全漏洞),这取决于另一端的软件如何处理格式不正确的URL。

最近的文章

Life Cycle of a URL Session

一个URL会话生命周期您可以使用NSURLSessionAPI有两种方式:使用系统提供的委托,或使用自定义委托。一般情况下,你必须使用自定义委托,如果你的应用程序需要做下列处理: 使用后台会话上传或下载内容,当您的应用程序没有运行。 执行自定义验证。 执行自定义SSL证书验证。 决定传输是否应被下载到磁盘,或基于由服务器返回的MIME类型显示。 从body stream上载数据(而不是一个NSData对象)。 代码限制缓存。 代码限制HTTP重定向。如果您的应用程序并不需要做...…

NSURLSession继续阅读
更早的文章

About the URL Loading System

关于URL加载系统本指南介绍了这个框架可用于URL交互,并使用标准的互联网协议与服务器进行通信。这些类被总称为URL Loading System。URL Loading System是一套class和protocol的集合,使您的应用程序通过URL访问内容。此技术的核心是NSURL类,它可以让应用程序处理指定URL和resource。为了支持NSURL类,Foundation框架提供一系列丰富的类,让你加载URL的内容,上传数据到服务器,管理cookie存储,控制响应缓存,处理证书存储和...…

WebP继续阅读