URLWithString: trả về nil


93

nó có thể rất dễ dàng, nhưng tôi dường như không tìm ra lý do tại sao URLWithString:trả về con số không ở đây.

//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];

1
Giá trị của webNametrước khi bạn gọi đến là stringWithFormat:gì? Sau đó, giá trị của stringURLtrước khi bạn gọi đến là URLWithString:bao nhiêu? Sử dụng NSLog()để in chúng ra từng bước hoặc đặt các điểm ngắt và kiểm tra các giá trị khi chúng được đặt.
Kevin Conner

Câu trả lời:


202

Bạn cũng cần phải thoát các ký tự không phải ASCII trong URL được mã hóa cứng của mình:

//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];

Bạn có thể loại bỏ việc thoát khỏi localisationName vì nó sẽ được xử lý bằng cách thoát toàn bộ chuỗi.


Đang cố gắng hiểu tại sao URLWithString lại đưa ra con số không ở đây. Tài liệu của Apple cho biết "Phải là một URL tuân theo RFC 2396. Phương thức này phân tích cú pháp URLString theo RFCs 1738 và 1808.". Đang đọc một số ...
russau

1
LOL - Liên minh huyền thoại, tôi đã sao chép một URL từ một email và điều này đã xảy ra! Cảm ơn.
Echelon

1
ngắt nếu URL có # trong đó. stringByAddingPercentEscapesUsingEncodingchuyển đổi # thành% 2
Ali Saeed

2
API trên không được dùng nữa. Bạn có thể sử dụng API sau webStringURL = [stringURL stringByAddingPercentEncodingWithAllowedCharacters:NSCharacterSet.URLQueryAllowedCharacterSet];
Rushabh,

41

Sử dụng Chức năng này nếu bạn xử lý tệp được lưu trên trình quản lý tệp.

NSURL *_url = [NSURL fileURLWithPath:path];

CẢM ƠN BẠN! Tôi đã nhận được một 'cắt ở giữa' url
codrut

8

Tôi đoán bạn cần sử dụng -[NSString stringByAddingPercentEscapesUsingEncoding:]. Xem tài liệu của Apple .

Một nhận xét khác là, là một bộ đếm thời gian cũ, tôi thấy hơi khó chịu khi đặt các ký tự không phải ASCII trong tệp nguồn. Điều đó nói rằng, tài liệu của Apple này cho biết, bắt đầu từ ngày 10.4, các chuỗi UTF-16 là OK bên trong @"...". Bằng cách nào đó, GCC dường như chuyển đổi chính xác tệp nguồn bằng tiếng Latinh-1 thành UTF-16 trong tệp nhị phân, nhưng tôi nghĩ an toàn nhất là chỉ sử dụng các ký tự ASCII 7-bit bên trong mã nguồn và sử dụng NSLocalizedString.


2

Tôi nghĩ rằng các nhân vật có dấu của bạn đang làm hỏng mọi thứ; chúng sẽ không được xử lý bởi -stringByAddingPercentEscapesUsingEncoding :.


2

NSURL URLWithString: @ "" sẽ trả về nil nếu URL không tuân theo RFC 2396 và chúng phải được thoát

Nếu bạn đọc qua rfc2396 trong liên kết, bạn sẽ nhận được vô số chi tiết

Một trang web tuyệt vời mà tôi đã tìm thấy để kiểm tra vị trí của ký tự vi phạm, hãy chọn tùy chọn đường dẫn cho URL

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


0

Lệnh gọi URLWithString: sẽ trả về giá trị nil nếu chuỗi được chuyển đến nó không đúng định dạng. Vì NSURL trả về nil cho các url không đúng định dạng, NSLog chuỗi của bạn và đặt các điểm ngắt để xem chính xác những gì đang được chuyển đến phương thức tạo NSURL của bạn. Nếu URLWithString của bạn hoạt động với một giá trị được mã hóa cứng, thì đó là bằng chứng nữa cho thấy bất kỳ thứ gì bạn đang chuyển qua đều không đúng định dạng. xem


-1

Bạn có thể sử dụng NSURL trực tiếp mà không cần NSString.

//.h tệp

@interface NewsBrowser : UIViewController {

    UIWebView *webView;
    NSURL *NewsUrl;

}

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

@property(nonatomic,assign)NSURL *NewsUrl;

@end

tệp //.m

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

Và tôi chuyển URL từ một chế độ xem khác (sử dụng biến NewsUrl) đến chế độ xem này.

Thử nó.


Câu trả lời này hoàn toàn không giải quyết được câu hỏi, đó là lý do tại sao URLWithString: trả về nil. (Ngoài ra, bạn thậm chí không thể hiện một phương tiện của việc thay đổi một chuỗi đến một URL.)
ArtOfWarfare
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.