使用Objective-C对字符串进行URLE编码

时间:2010-04-07 06:59:19

标签: objective-c cocoa string urlencode

我正在尝试对字符串进行URL编码,以形成来自objective-c的GET请求。

NSString *params = @"'Decoded data!'/foo.bar:baz";

NSRunAlertPanel( @"Error", [params urlEncoded], @"OK", nil, nil );

这是扩展NSString的类别

    -(NSString *) urlEncoded
{
    NSString *encoded = (NSString *)CFURLCreateStringByAddingPercentEscapes(
                                                   NULL,
                                                   (CFStringRef)self,
                                                   NULL,
                                                   (CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ",
                                                   kCFStringEncodingUTF8 );
    return encoded;
}

所以第一次运行它我就回来了

1606410046ecoded          1606410784ata2270.000000foo.bar0X1.001716P-1042baz

来自对话框。

我再次运行后立刻得到了这个

1606410046ecoded          1606410944ata227369374562920703448982951250259562309742470533728899744288431318481119278377104028261651081181287077973859930826299575521579020410425419424562236383226511593137467590082636817579938932512039895040.000000foo.bar0X1.66E6156303225P+771baz

然后,如果我再次运行它,它会回到第一个。这真的很奇怪。

如果params设置为@“&”或@“”我只是在对话框中找回“2”(没有引号)。

还有一种方法可以在警告对话框中显示%符号吗?

由于

5 个答案:

答案 0 :(得分:23)

我认为NSAlert%字符解释为字符串格式说明符,其中填充了随机数据。只需NSLog输出就可以了:

%27Decoded%20data%21%27%2Ffoo.bar%3Abaz

此外,您的-urlEncoded类别方法中存在内存泄漏。您可以使用包含Create的CF函数创建字符串,因此您有责任释放它。

-(NSString *) urlEncoded
{
   CFStringRef urlString = CFURLCreateStringByAddingPercentEscapes(
                                                   NULL,
                                                   (CFStringRef)self,
                                                   NULL,
                                                   (CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ",
                                                   kCFStringEncodingUTF8 );
    return [(NSString *)urlString autorelease];
}

答案 1 :(得分:6)

我已经开源了我的URL编码器实用程序类,它智能地跳过URL的域和路径部分(以避免编码斜杠等...)并且只转义未跟随2位数的百分比序列十六进制代码(以防止像这样的百分比的双重编码:%20 - >%2520)。

它已针对超过10,000个网址进行了测试,并且非常强大且高效。

您可以在此处详细了解(并下载)我的实施内容...... http://jayfuerstenberg.com/devblog/url-encoding-in-objective-c

答案 2 :(得分:2)

使用ARC时不再使用自动释放,而是通过传递字符串并使用CFBridgingRelease来创建实例方法:

- (NSString *)urlEncodeWithString: (NSString*)string
{
  CFStringRef urlString = CFURLCreateStringByAddingPercentEscapes(
                                                                  NULL,
                                                                  (CFStringRef)string,
                                                                  NULL,
                                                                  (CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ",
                                                                  kCFStringEncodingUTF8 );
  return (NSString *)CFBridgingRelease(urlString);
}

答案 3 :(得分:1)

好的结果证明这不是一个问题。它被正确编码,因为我检查了服务器日志,似乎请求参数被编码。

为了正确显示对话框中的编码字符串,我只是在事后用%%替换了%的所有实例。

答案 4 :(得分:0)

在我看来,最简单的方法是使用NSString (NSURLUtilities)类别

提供的方便方法

我的实施:

- (NSString *) urlEncodedString
{
    NSString *result = [self stringByReplacingOccurrencesOfString:@" " withString:@"+"];
    result = [result stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    return result;
}