Objective-C 对 URL 进展 URLEncode 编码

简介: <span style="padding:0px; margin:0px; color:rgb(102,102,102); font-size:14px; font-family:微软雅黑; line-height:24px">Objective-C 对 URL 进行 URLEncode 编码</span><br style="padding:0px; margin:0px; font-s
+关注继续查看
Objective-C 对 URL 进行 URLEncode 编码
在 iOS 程序访问 HTTP 资源时需要对 URL 进行 Encode,比如像拼出来的 +&sd f&p2=中文,其中的中文、特殊符号&%和空格都必须进行转译才能正确访问。

在 Java、.net 和 JS 中都有相应的 encodeURL 方法可用,在 Objective-C 语言中,你可以试下

- (NSString *)stringByAddingPercentEscapesUsingEncoding:(NSStringEncoding)enc;

来对完整的 URL(带请求参数的)进行编码,比如执行下面的代码:

NSString *url=@"+&sd &p2=中文";
NSString *encodedValue = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
上面代码转换出的 encodedValue 是:

+&sd%20&p2=%E4%B8%AD%E6%96%87

可见,它不会转换 URL 中的 %& 符号,这也正常,因为它肯定分不出哪个 & 是参数的连接符号还是参数值,你可以单独编码参数,然后在拼接成 URL 之前把属性参数值中的 %& 等符号分别替换成相应的编码。

或者,您还可以试下另外一个方法来单独编码参数值,然后拼接成完整的 URL:

/* newString = CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, origString, NULL, NULL, kCFStringEncodingUTF8); */
CF_EXPORT
CFStringRef CFURLCreateStringByAddingPercentEscapes(CFAllocatorRef allocator, CFStringRef originalString, CFStringRef charactersToLeaveUnescaped, CFStringRef legalURLCharactersToBeEscaped, CFStringEncoding encoding);

参考代码,分别编码前面的 p1=%+&sd f&p2=中文,两个参数的代码和结果如下:

NSString *param = @"%+&sd f";
    NSString *encodedValue = (NSString*)CFURLCreateStringByAddingPercentEscapes(nil,
                                   (CFStringRef)param, nil,
                                (CFStringRef)@"!*'();:@&=+$,/ %#[]", kCFStringEncodingUTF8);
这样编码出来的 encodedValue 为 %25%2B%26sd%20f,对 %& 等符号也会编码的。用上面的代码对 “中文” 进行编码的结果是:%E4%B8%AD%E6%96%87,与前面是一致的。

我实际应用时还是这个 CFURLCreateStringByAddingPercentEscapes 方法比较方便。

我们在项目中是使用的 ASIHTTPRequest 组件来访问 URL 的,在使用 ASIFormDataRequest 时发出它其中有一个方法:

- (NSString*)encodeURL:(NSString *)string
{
    NSString *newString = NSMakeCollectable([(NSString *)CFURLCreateStringByAddingPercentEscapes(
                                                              kCFAllocatorDefault,
                                  (CFStringRef)string, NULL, CFSTR(":/ #[]@!$ &'()*+,;=\"$amp;                        CFStringConvertNSStringEncodingToEncoding([self stringEncoding])) autorelease]);
    if (newString) {
        return newString;
    }
    return @"";
}
看起来它就是个 Objective-C 版的 encodeURL 方法,可是它声明成了一个实例方法,必须构造出 ASIFormDataRequest 实例才能使用它,在它的父类 ASIHTTPRequest 中都无该方法。现在来试验一下这个方法的返回值:

ASIFormDataRequest *formDataRequest = [ASIFormDataRequest requestWithURL:nil];
NSString *encodedValue1 = [formDataRequest encodeURL:@"%+&sd f"];
NSString *encodedValue2 = [formDataRequest encodeURL:@"中文"];
得出的 encodedValue1 和 encodedValue2 分别是 %25%2B%26sd%20f 和 %E4%B8%AD%E6%96%87,和前面是一致的,所以你可以用 ASIFormDataRequest 提供的方式来进行 URLEncode,把这个方法提出为一个工具方法即可。;$gt;%{}|\\^~`"),
目录
相关文章
|
4天前
|
JavaScript
URL编码中的escape、encodeURI和encodeURIComponent
URL编码中的escape、encodeURI和encodeURIComponent
24 1
|
5天前
|
存储 Web App开发 JavaScript
Unicode、UTF 和 ISO-8859-1等编码方式详解与浏览器URL编码
Unicode、UTF 和 ISO-8859-1等编码方式详解与浏览器URL编码
62 0
|
28天前
|
JavaScript 前端开发
JS实现url的编码和解码
JS实现url的编码和解码
|
1月前
a标签下载特殊字符url手动编码浏览器兼容性不显示
a标签下载特殊字符url手动编码浏览器兼容性不显示
|
3月前
|
JavaScript PHP
BUUCTF Crypto Url编码1
BUUCTF Crypto Url编码1
33 0
|
4月前
|
数据安全/隐私保护
URL编码解析方式-特殊字符加密和解密
我们一起来看看为什么要给特殊字符进行加密,那又如何进行解密呢?
|
6月前
|
编解码 Java 对象存储
【java】对URL中的中文和符号进行UrlEncode转码
【java】对URL中的中文和符号进行UrlEncode转码
256 0
|
Python
Python使用quote、unquote、urlencode、urldecode对url编码解码
Python使用quote、unquote、urlencode、urldecode对url编码解码
165 0
|
数据采集 Python
Python爬虫:urlencode带参url的拼接
Python爬虫:urlencode带参url的拼接
210 0
|
Java
Java 技术篇 - ServerSocket接收http的url请求中包含中文的处理方法,URLDecode与URLEncode,url解码与编码
Java 技术篇 - ServerSocket接收http的url请求中包含中文的处理方法,URLDecode与URLEncode,url解码与编码
209 0
Java 技术篇 - ServerSocket接收http的url请求中包含中文的处理方法,URLDecode与URLEncode,url解码与编码
相关产品
云迁移中心
推荐文章
更多