URLWithString:返回nil

时间:2009-12-30 17:36:22

标签: iphone objective-c url nsstring nsurl

这可能很容易,但我似乎没有找出为什么URLWithString:在这里返回nil。

//localisationName is a arbitrary string here
NSString* webName = [localisationName stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
NSString* stringURL = [NSString stringWithFormat:@"http://maps.google.com/maps/geo?q=%@,Montréal,Communauté-Urbaine-de-Montréal,Québec,Canadae&output=csv&oe=utf8&sensor=false&key=", webName];
NSURL* url = [NSURL URLWithString:stringURL];

8 个答案:

答案 0 :(得分:198)

您还需要转义硬编码网址中的非ASCII字符:

//localisationName is a arbitrary string here
NSString* webName = [localisationName stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
NSString* stringURL = [NSString stringWithFormat:@"http://maps.google.com/maps/geo?q=%@,Montréal,Communauté-Urbaine-de-Montréal,Québec,Canadae&output=csv&oe=utf8&sensor=false", webName];
NSString* webStringURL = [stringURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL* url = [NSURL URLWithString:webStringURL];

您可以删除localisationName的转义,因为它将通过转义整个字符串来处理。

答案 1 :(得分:39)

如果您处理保存在文件管理器上的文件,请使用此功能。

NSURL *_url = [NSURL fileURLWithPath:path];

答案 2 :(得分:8)

我猜您需要使用-[NSString stringByAddingPercentEscapesUsingEncoding:]。请参阅Apple doc

另一个评论是,作为旧计时器,我发现将非ASCII字符放在源文件中有点不安。 也就是说,这个Apple doc说,从10.4开始,@"..."内的UTF-16字符串就可以了。 不知何故,GCC似乎正确地将Latin-1中的源文件转换为二进制文件中的UTF-16,但我认为使用它是最安全的 仅在源代码内部使用7位ASCII字符,并使用NSLocalizedString

答案 3 :(得分:2)

我认为你的重音人物正在抛弃它;它们不会被-stringByAddingPercentEscapesUsingEncoding处理:。

答案 4 :(得分:2)

NSURL URLWithString:如果网址不符合RFC 2396,则@“”将返回nil并且必须对其进行转义

如果您通过链接阅读rfc2396,您将获得大量详细信息

我找到了一个很棒的网站,用于检查违规字符的位置,选择网址

的路径选项

http://www.websitedev.de/temp/rfc2396-check.html.gz

答案 5 :(得分:0)

如果传递给它的字符串格式错误,则URLWithString:call将返回nil。 由于NSURL对格式错误的URL返回nil,因此NSLog您的字符串并设置断点以准确查看传递给NSURL创建方法的内容。如果您的URLWithString使用硬编码值,则可以进一步证明您传递的内容格式不正确。see

答案 6 :(得分:0)

更新: 由于stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding已被弃用,因此您应该使用stringByAddingPercentEncodingWithAllowedCharacters

[stringURL stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];

这是根据您的情况设置的允许字符的列表。

+ (NSCharacterSet *)URLUserAllowedCharacterSet;
+ (NSCharacterSet *)URLPasswordAllowedCharacterSet;
+ (NSCharacterSet *)URLHostAllowedCharacterSet;
+ (NSCharacterSet *)URLPathAllowedCharacterSet;
+ (NSCharacterSet *)URLQueryAllowedCharacterSet;
+ (NSCharacterSet *)URLFragmentAllowedCharacterSet;

参考:https://developer.apple.com/reference/foundation/nsstring/1411946-stringbyaddingpercentencodingwit

答案 7 :(得分:-1)

您可以在没有NSString的情况下直接使用NSURL。

//。h file

@interface NewsBrowser : UIViewController {

    UIWebView *webView;
    NSURL *NewsUrl;

}

@property (nonatomic, retain) IBOutlet UIWebView *webView;

@property(nonatomic,assign)NSURL *NewsUrl;

@end

//。m file

[webView loadRequest:[NSURLRequest requestWithURL:NewsUrl]];

我将URL从另一个视图(使用NewsUrl变量)传递给此视图。

试试吧。