`
re_reference
  • 浏览: 237116 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

[转]Objective-C 对 URL 进行 URLEncode 编码

阅读更多
强烈建议使用
(NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,(CFStringRef)string,NULL,CFSTR("!*'();:@&=+$,/?%#[]"),kCFStringEncodingUTF8);

替换
stringByAddingPercentEscapesUsingEncoding:


在 iOS 程序访问 HTTP 资源时需要对 URL 进行 Encode,比如像拼出来的 http://unmi.cc?p1=%+&sd f&p2=中文,其中的中文、特殊符号&%和空格都必须进行转译才能正确访问。

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

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

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

NSString *url=@"http://unmi.cc?p1=%+&sd &p2=中文";
NSString *encodedValue = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
上面代码转换出的 encodedValue 是:

http://unmi.cc?p1=%25+&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(":/?#[]@!$ &'()*+,;=\"<>%{}|\\^~`"),
                        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,把这个方法提出为一个工具方法即可。


摘自:http://unmi.cc/objective-c-urlencode
分享到:
评论

相关推荐

    PB 进制转换 url编码 urlencode urldecode 数组排序

    自己写的,可能有bug,请大家一块学习 环境为PB12 函数(及参数) 作用 arraysort 对一维数组进行排序 decto 将十进制数字转成其它进制字符串 ...urlencode 将指定字符串以进行指定字符集url编码 涨价了,哈哈

    URLEncode编码转换软件

    在VB(Visual Basic)编程环境中,发送XMLHTTP请求时,为了确保数据的正确性和安全性,我们需要对包含非ASCII字符的数据进行编码。URLEncode函数是VB中用于此目的的关键函数。URLEncode会将空格转换为加号"+",并将...

    urlencode urldecode实现

    对于 `urlencode` 和 `urldecode`,你可能需要自定义C++函数来实现这些功能,然后在C++代码中定义,并在桥接头文件中声明,使得Objective-C或Swift代码可以调用。 以下是一个简单的C++示例实现 `urlencode` 和 `url...

    关于applicationx-www-form-urlencoded等字符编码的解释说明

    * 它可以将窗体数据编码为名称/值对,易于服务器解析和处理 * 它可以与get和post请求同时使用 然而,application/x-www-form-urlencoded也存在一些缺点,如: * 它不能上传文件,因为它只能将窗体数据编码为名称/...

    UrlEncode编码转换.zip

    这个压缩包文件"UrlEncode编码转换.zip"很可能包含了关于如何进行URL编码转换的相关教程或工具。在这个讨论中,我们将深入探讨URL编码的原理、用途以及如何进行编码和解码。 URL编码是因特网标准RFC 3986定义的一...

    URLEncode 字符编码转换

    URLEncode是一种字符编码方式,主要用于在URL(统一资源定位符)中传输非ASCII字符。这是因为URL在HTTP协议中必须使用ASCII字符集,并且某些字符在URL中具有特殊含义,如空格通常被解析为分隔符。为了在URL中包含...

    J2ME 实现的 UrlEncode编码

    J2ME 实现的 UrlEncode编码 J2ME 实现的 UrlEncode编码 J2ME 实现的 UrlEncode编码

    MFC中将普通的字符串转成urlencode格式

    在本篇文章中,我们将深入探讨如何在MFC(Microsoft Foundation Classes)框架中实现字符串到URL编码(即urlencode格式)的转换。此过程涉及到对字符进行特定格式化处理,以便它们能够在URL中安全传输。 ### MFC...

    易语言URL编解码

    URLEncode是将URL中的非字母数字字符转换为ASCII码的百分号编码形式,如空格通常会被转换为"%20"。这样做的原因是URL中不能包含某些字符,如空格、引号等,它们需要被转义以防止被误解或破坏URL的结构。而URLDecode...

    UrlEncodeDecode解码编码工具(双向)

    它能够帮助开发者、网站管理员或者普通用户快速、准确地对URL进行编码和解码。无论是为了调试、测试还是日常的数据处理,这个工具都能提供便捷的服务。 该工具的双向功能意味着它不仅能够处理编码过程,还能处理...

    node-iconv-urlencode:用于将 url 编码的字符串编码和解码为每种可能编码的节点包

    iconv-urlencode 用于编码和解码来自/到每种可能编码的 url 编码字符串的节点包这个包使用iconv-lite进行不同字符集的编码。 因此,此包支持的所有编码都可以在这里使用。 转换后的字符串根据 HTML5 规范进行 url ...

    urlEncode or urlDecode

    - 编码应仅针对URL的一部分,通常只对查询字符串或路径部分进行编码,而不是整个URL。 - 在进行URL编码时,要考虑URL编码规范,避免使用不标准的编码方式,以保证跨平台和跨浏览器的兼容性。 - URL编码是安全的,...

    用C++来实现UrlEncode

    5. **URL编码实现**:`inline string URLEncode(const string& sIn)` 是核心函数,它接受一个字符串参数,遍历每个字符并根据上述规则进行编码。对于字母和数字,直接保留;对于空格,替换为加号;对于其他字符,...

    Quoted-printable 编码介绍、Quoted-printable编码解码转换方法

    这个函数首先对字符串进行urlencode转换,然后将所有的“%”字符替换为“=”号。随后,如果出现连续超过73个非换行和非等号的字符,就在后面加上一个“=\r\n”。这个简单的实现方法基本上遵循了Quoted-printable编码...

    UrlEncodeUrlDecodeUrl解码Url编码工具

    它是一个实用的小工具,能够帮助用户对URL进行编码和解码,确保数据在通过网络传递时保持完整性和可读性。 URL(统一资源定位符)是互联网上的地址,它用于标识和访问网络资源。然而,URL中可能包含一些特殊字符,...

    url编码转化,将url转化成unicode进行传输

    ### URL编码转换:将URL转换为Unicode进行传输 在互联网技术的应用中,URL(Uniform Resource Locator,统一资源定位符)编码转换是一项基本且重要的技术。本文将深入探讨URL编码转换的相关概念、应用场景以及一个...

    java使用URLDecoder和URLEncoder对中文字符进行编码和解码

    1. `URLEncoder.encode`: 对普通字符串进行编码,使其适合在URL中传输。 2. `URLDecoder.decode`: 解码URL中的编码字符串,恢复原始的文本信息。 在处理网络请求、特别是涉及到中文字符和其他特殊字符时,这两个...

    js urlEncode编码

    js以utf-8对中文字符编码有现成的函数,但js 以GBK对中文字符编码却没有,这里就提供给大家,希望对大家有帮助

    解决了浏览器URL地址栏直接输入get参数值包含中文时的urlencode编码格式问题

    原来urlencode这个函数有2中编码方式,一种是gbk格式的编码,一种是utf-8格式的。并且这个格式居然不能再这个函数里面设置,导致这个结果不可控制,在不同浏览器环境下面结果不同,不能得到自己想要的格式编码。在...

    JS版 UrlEncode

    尽管这个JS版本的`UrlEncode`和`UrlDecode`函数能够处理大多数基本的编码和解码需求,但在实际应用中,开发者应考虑使用JavaScript内置的`encodeURIComponent`和`decodeURIComponent`函数,因为它们遵循更严格的编码...

Global site tag (gtag.js) - Google Analytics