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

Chr*_*ris 12 string cocoa objective-c urlencode

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

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

NSRunAlertPanel( @"Error", [params urlEncoded], @"OK", nil, nil );
Run Code Online (Sandbox Code Playgroud)

这是扩展NSString的类别

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

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

1606410046ecoded          1606410784ata2270.000000foo.bar0X1.001716P-1042baz
Run Code Online (Sandbox Code Playgroud)

从对话框中.

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

1606410046ecoded          1606410944ata227369374562920703448982951250259562309742470533728899744288431318481119278377104028261651081181287077973859930826299575521579020410425419424562236383226511593137467590082636817579938932512039895040.000000foo.bar0X1.66E6156303225P+771baz
Run Code Online (Sandbox Code Playgroud)

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

如果params设置为@"&"或@"",我只需在对话框中找回"2"(不带引号).

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

谢谢

Rob*_*ger 23

我认为将字符NSAlert解释%为字符串格式说明符,其中填充了随机数据.只是NSLog输出,它很好:

%27Decoded%20data%21%27%2Ffoo.bar%3Abaz
Run Code Online (Sandbox Code Playgroud)

此外,您的-urlEncoded类别方法中存在内存泄漏.您使用CF函数创建字符串,Create因此您负责释放它.

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

  • 这意味着你可能正在使用这样的`NSLog`:`NSLog(encoded)`.`NSLog`的第一个参数是格式字符串,而不是普通字符串.任何字符串格式的占位符都将替换为后面的参数,在这种情况下是未定义的.你必须像这样记录字符串:`NSLog(@"%@",encoded);`. (3认同)

Jas*_*erg 6

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

它已针对超过10,000个URL进行了测试,并且非常强大且性能卓越.

你可以在这里了解更多关于(并下载)我的实现的内容...... http://jayfuerstenberg.com/devblog/url-encoding-in-objective-c