注册 登录
主题 : URL encode類函數[objc實現, iPhone可用, by透明de面具]
级别: 版主

状态: 连续签到 - [144天]
UID: 491
精华: 6
发帖: 1766
可可豆: 112205 CB
威望: 112852 点
在线时间: 8537(时)
注册时间: 2008-08-19
最后登录: 2019-05-19
0 楼:  发表于: 2009-02-28 02:22    发自: Web Page
来源于 iPhone类代码 分类

URL encode類函數[objc實現, iPhone可用, by透明de面具]    (在iOS代码库中浏览本帖)

管理提醒: 本帖被 lvyile 从 开发资源区 移动到本区(2009-04-03)

+ (NSString*)URLencode:(NSString *)originalString
        stringEncoding:(NSStringEncoding)stringEncoding {
    //!  @  $  &  (  )  =  +  ~  `  ;  '  :  ,  /  ?
    //%21%40%24%26%28%29%3D%2B%7E%60%3B%27%3A%2C%2F%3F
    NSArray *escapeChars = [NSArray arrayWithObjects:@";" , @"/" , @"?" , @":" ,
                            @"@" , @"&" , @"=" , @"+" ,    @"$" , @"," ,
                            @"!", @"'", @"(", @")", @"*", nil];
    
    NSArray *replaceChars = [NSArray arrayWithObjects:@"%3B" , @"%2F", @"%3F" , @"%3A" ,
                             @"%40" , @"%26" , @"%3D" , @"%2B" , @"%24" , @"%2C" ,
                             @"%21", @"%27", @"%28", @"%29", @"%2A", nil];
    
    int len = [escapeChars count];
    
    NSMutableString *temp = [[originalString
                              stringByAddingPercentEscapesUsingEncoding:stringEncoding]
                             mutableCopy];
    
    int i;
    for (i = 0; i < len; i++) {
        
        [temp replaceOccurrencesOfString:[escapeChars objectAtIndex:i]
                              withString:[replaceChars objectAtIndex:i]
                                 options:NSLiteralSearch
                                   range:NSMakeRange(0, [temp length])];
    }
    
    NSString *outStr = [NSString stringWithString: temp];
    
    return outStr;
}
[ 此帖被aaronglyang在2011-12-28 16:39重新编辑 ]

 Developer
------------------------------------------------------------
Η αγάπη ποτέ δεν αποτυγχάνει.
愛是永不止息。
Love never fails.

    --《圣经.新约》哥林多前书第13章
级别: 光明使者

状态: 连续签到 - [255天]
UID: 2069
精华: 5
发帖: 1091
可可豆: 124131 CB
威望: 126125 点
在线时间: 2590(时)
注册时间: 2009-02-07
最后登录: 2019-04-23
1 楼:  发表于: 2009-04-09 11:29    发自: Web Page
引用
引用楼主lvyile于2009-02-28 02:22发表的 URL encode類函數[objc實現, iPhone可用, by透明de面具] :
[lang=objc]
+ (NSString*)URLencode:(NSString *)originalString
        stringEncoding:(NSStringEncoding)stringEncoding {
    //!  @  $  &  (  )  =  +  ~  `  ;  '  :  ,  /  ?
    //%21%40%24%26%28%29%3D%2B%7E%60%3B%27%3A%2C%2F%3F
.......



太深了。。看的有些模糊、、
汉字字典 -2018最新专业版
级别: 版主

状态: 连续签到 - [144天]
UID: 491
精华: 6
发帖: 1766
可可豆: 112205 CB
威望: 112852 点
在线时间: 8537(时)
注册时间: 2008-08-19
最后登录: 2019-05-19
2 楼:  发表于: 2009-04-10 16:33    发自: Web Page
哪裡深楽? 請提出來, 一起看一下
引用
引用第1楼angellixf于2009-04-09 11:29 AM发表的  :



太深了。。看的有些模糊、、

 Developer
------------------------------------------------------------
Η αγάπη ποτέ δεν αποτυγχάνει.
愛是永不止息。
Love never fails.

    --《圣经.新约》哥林多前书第13章
级别: 新手上路
UID: 2584
精华: 0
发帖: 1
可可豆: 600 CB
威望: 600 点
在线时间: 147(时)
注册时间: 2009-03-04
最后登录: 2010-04-04
3 楼:  发表于: 2009-04-30 22:16    发自: Web Page
其实NSString有类似的内置Instance Methods
- (NSString *)stringByAddingPercentEscapesUsingEncoding:(NSStringEncoding)encoding
- (NSString *)stringByReplacingPercentEscapesUsingEncoding:(NSStringEncoding)encoding

不过这两个方法,都是把输入串认为是完整url来encode的(姑且称为url encode吧),而不是以component方式来encode。这两者有什么区别呢,拿g.cn/?x=5&y=6来说。如果你要传入整个url作为encode的串,那么就应该使用url encode,而不是component encode。因为component encode出来的结果是希望能被用于url的一个部分,它的一个例子是g.cn/?x=/aa/bb。这时候我们就希望那个对/aa/bb里的/也encode,而url encode方式是不会对它做任何处理的。

简单地说,就是component encode比full url encode多encode了几个字符。据我目前了解,除非引入类似lv的category,否则NSString是无法做component encode的。不过老的那套api倒是有办法做到。

NSString *encoded_value =
                [(NSString *)CFURLCreateStringByAddingPercentEscapes(
                    nil,
                    (CFStringRef)@"%!@#$^&*(",
                    NULL,
                    (CFStringRef)@"!/&",
                    kCFStringEncodingUTF8)
                autorelease];

注意这里CFURLCreateStringByAddingPercentEscapes的倒数第二个参数,我指定了@"!/&"也要被escape。

其实在我接触过的几套语言系统里,我觉得javascript在这方面提供的api是最完善的,看:http://xkr.us/articles/javascript/encode-compare/

javascript提供的encodeURI()和encodeURIComponent(),就是我上面是提到的两个概念。不过js毕竟是主打web开发的,这方面比较完善也不奇怪。
级别: 新手上路
UID: 2584
精华: 0
发帖: 1
可可豆: 600 CB
威望: 600 点
在线时间: 147(时)
注册时间: 2009-03-04
最后登录: 2010-04-04
4 楼:  发表于: 2009-04-30 22:18    发自: Web Page
对了,lv,你的那个实现,为什么不把数组做成static呢?我想这样效率会高些。
级别: 版主

状态: 连续签到 - [144天]
UID: 491
精华: 6
发帖: 1766
可可豆: 112205 CB
威望: 112852 点
在线时间: 8537(时)
注册时间: 2008-08-19
最后登录: 2019-05-19
5 楼:  发表于: 2009-05-01 00:49    发自: Web Page
的確, 這段代碼有很多隱患, 回頭小僧來分解
剛剛在Skype上跟team開會三個小時...現在頭暈楽....沒法思考楽....

先謝謝surfchen先, 回頭過來修改整理

引用
引用第4楼surfchen于2009-04-30 10:18 PM发表的  :
对了,lv,你的那个实现,为什么不把数组做成static呢?我想这样效率会高些。

 Developer
------------------------------------------------------------
Η αγάπη ποτέ δεν αποτυγχάνει.
愛是永不止息。
Love never fails.

    --《圣经.新约》哥林多前书第13章
级别: 版主

状态: 连续签到 - [144天]
UID: 491
精华: 6
发帖: 1766
可可豆: 112205 CB
威望: 112852 点
在线时间: 8537(时)
注册时间: 2008-08-19
最后登录: 2019-05-19
6 楼:  发表于: 2009-12-10 11:15    发自: Web Page
拖拉乐大半年的东西,今天突然在320里头看到,补出来:
引用
引用第3楼surfchen于2009-04-30 10:16 PM发表的  :
其实NSString有类似的内置Instance Methods
- (NSString *)stringByAddingPercentEscapesUsingEncoding:(NSStringEncoding)encoding
- (NSString *)stringByReplacingPercentEscapesUsingEncoding:(NSStringEncoding)encoding

不过这两个方法,都是把输入串认为是完整url来encode的(姑且称为url encode吧),而不是以component方式来encode。这两者有什么区别呢,拿g.cn/?x=5&y=6来说。如果你要传入整个url作为encode的串,那么就应该使用url encode,而不是component encode。因为component encode出来的结果是希望能被用于url的一个部分,它的一个例子是g.cn/?x=/aa/bb。这时候我们就希望那个对/aa/bb里的/也encode,而url encode方式是不会对它做任何处理的。
.......


拖拉乐大半年的东西,今天突然在320里头看到,补出来:



/**
 * URL encodes a string
 */
- (NSString*)stringByURLEncodingStringParameter;

//.m
- (NSString*)stringByURLEncodingStringParameter
{
    // NSURL's stringByAddingPercentEscapesUsingEncoding: does not escape
    // some characters that should be escaped in URL parameters, like / and ?; 
    // we'll use CFURL to force the encoding of those
    //
    // We'll explicitly leave spaces unescaped now, and replace them with +'s
    //
    // Reference: http://www.ietf.org/rfc/rfc3986.txt
    
    NSString *resultStr = self;
    
    CFStringRef originalString = (CFStringRef) self;
    CFStringRef leaveUnescaped = CFSTR(" ");
    CFStringRef forceEscaped = CFSTR("!*'();:@&=+$,/?%#[]");
    
    CFStringRef escapedStr;
    escapedStr = CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
                                                         originalString,
                                                         leaveUnescaped, 
                                                         forceEscaped,
                                                         kCFStringEncodingUTF8);
    
    if( escapedStr )
    {
        NSMutableString *mutableStr = [NSMutableString stringWithString:(NSString *)escapedStr];
        CFRelease(escapedStr);
        
        // replace spaces with plusses
        [mutableStr replaceOccurrencesOfString:@" "
                                    withString:@"%20"
                                       options:0
                                         range:NSMakeRange(0, [mutableStr length])];
        resultStr = mutableStr;
    }
    return resultStr;
}

[ 此帖被lvyile在2011-12-28 17:29重新编辑 ]

 Developer
------------------------------------------------------------
Η αγάπη ποτέ δεν αποτυγχάνει.
愛是永不止息。
Love never fails.

    --《圣经.新约》哥林多前书第13章
级别: 新手上路
UID: 19897
精华: 0
发帖: 17
可可豆: 170 CB
威望: 170 点
在线时间: 30(时)
注册时间: 2010-05-19
最后登录: 2011-12-16
7 楼:  发表于: 2010-05-19 14:32    发自: Web Page
的确很强大,刚做过c++的base64encode和URLencode,再来看obj-c的
[ 此帖被hzysoft在2010-05-19 15:09重新编辑 ]

级别: 侠客
UID: 19956
精华: 0
发帖: 116
可可豆: 1061 CB
威望: 1061 点
在线时间: 1141(时)
注册时间: 2010-05-19
最后登录: 2017-03-07
8 楼:  发表于: 2010-12-15 16:37    发自: Web Page
回 6楼(lvyile) 的帖子
弱弱的问一句 - (NSString*)stringByURLEncodingStringParameter这个方法怎么没有传入需要encoding的NSString作为参数呢?
级别: 侠客
UID: 13687
精华: 0
发帖: 70
可可豆: 682 CB
威望: 682 点
在线时间: 25(时)
注册时间: 2010-02-02
最后登录: 2015-08-26
9 楼:  发表于: 2010-12-19 18:08    发自: Web Page
谢楼主, 这个mark一下,以后可能会用到

CocoaChina社区转载内容已尽可能注明出处,如未能核实来源或转发内容图片有权利瑕疵的,请及时联系社区进行修改或删除【联系方式QQ : 3442093904 邮箱:support@cocoachina.com】文章内容为作者独立观点,不代表CocoaChina社区立场。版权归原作者所有,如申请授权请联系作者,因文章侵权CocoaChina社区不承担任何法律及连带责任。

描述
快速回复

关注本帖(如果有新回复会站内信通知您)

发帖、回帖都会得到可观的积分奖励。查看论坛积分规则

按"Ctrl+Enter"直接提交
    顶部