在Cocoa应用中打开非标准URL
时间:2020-03-05 18:48:15 来源:igfitidea点击:
在我正在编写的应用程序中,我有一些这样的代码:
NSWorkspace* ws = [NSWorkspace sharedWorkspace]; NSString* myurl = @"http://www.somewebsite.com/method?a=%d"; NSURL* url = [NSURL URLWithString:myurl]; [ws openURL:url];
主要区别在于myurl来自我无法控制的地方。请注意,URL中的%d并不完全正确,这意味着URLWithString失败,返回nil。
处理此问题的"正确"方法是什么?我是否需要解析字符串并正确编码参数?还是可可中有一些聪明的方法可以为我做所有的辛苦工作?
解决方案
回答
我认为这里的行为是正确的,因为%d并非URL的有效组成部分(%是转义符,但希望后面跟随两个十六进制字符)。
我们不能仅对提供给URL进行URL编码,因为那样也可以对/ s和?s进行编码,这是我们不想要的。
所以,问题是,这里的正确行为是什么?
也许我们希望将其变成...
http://www.somewebsite.com/method?a=%25d
(即%被编码为URL中%的编码版本,因此当方法获得输入时,它将a设置为%d)
我认为没有任何库函数可以为我们做这种事情,因为没有"正确"的方法可以做到。关于他,我们唯一可以做的正确的事情就是返回一条错误消息,提示我们给出的URL无效(就像URLWithString一样)
如果我们想尝试处理输入,我想我们需要在URL中搜索不立即跟有两个十六进制字符的任何%符号,然后在这种情况下用%25替换%。尽管我怀疑如果URL开始包含ASCII字符集以外的字符的编码版本,则使用正则表达式应该可以实现这一点。
回答
我不确定这是否正是我们要寻找的,但是NSString中有一个方法可以清理URL:
stringByAddingPercentEscapesUsingEncoding: