URLWithString: คืนค่า nil


93

มันอาจจะง่ายมาก แต่ฉันดูเหมือนจะไม่พบว่าทำไมจึงURLWithString:กลับมาที่นี่

//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
มูลค่าของwebNameก่อนที่คุณจะโทรไปstringWithFormat:คืออะไร? แล้วค่าของstringURLก่อนที่คุณจะโทรไปURLWithString:คืออะไร? ใช้NSLog()เพื่อพิมพ์ทีละขั้นตอนหรือตั้งค่าจุดพักและตรวจสอบค่าตามที่ตั้งไว้
Kevin Conner

คำตอบ:


202

คุณต้องหลีกเลี่ยงอักขระที่ไม่ใช่ ASCII ใน URL แบบฮาร์ดโค้ดของคุณด้วย:

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

คุณสามารถลบ Escape ของ localisationName ได้เนื่องจากจะถูกจัดการโดยการ Escape ของสตริงทั้งหมด


พยายามทำความเข้าใจว่าเหตุใด URLWithString จึงให้ศูนย์ที่นี่ เอกสารของ Apple ระบุว่า "ต้องเป็น URL ที่สอดคล้องกับ RFC 2396 วิธีนี้จะแยกวิเคราะห์ URLString ตาม RFCs 1738 และ 1808" กำลังอ่าน ...
russau

1
ฮ่า ๆ ฉันคัดลอก URL จากอีเมลและสิ่งนี้ก็เกิดขึ้น! ขอบคุณ.
Echelon

1
หยุดพักหาก URL มี # อยู่ในนั้น stringByAddingPercentEscapesUsingEncodingแปลง # เป็น% 2
Ali Saeed

3
API ด้านบนเลิกใช้งานแล้ว คุณสามารถใช้ API ต่อไปนี้ webStringURL = [stringURL stringByAddingPercentEncodingWithAllowedCharacters:NSCharacterSet.URLQueryAllowedCharacterSet];
Rushabh

41

ใช้ฟังก์ชันนี้หากคุณจัดการกับไฟล์ที่บันทึกไว้ในตัวจัดการไฟล์

NSURL *_url = [NSURL fileURLWithPath:path];

ขอขอบคุณ! ฉันได้รับ URL 'ตัดแต่งตรงกลาง'
codrut

8

-[NSString stringByAddingPercentEscapesUsingEncoding:]ผมคิดว่าคุณจำเป็นต้องใช้ ดูแอปเปิ้ล doc

ความคิดเห็นอีกประการหนึ่งคือเนื่องจากตัวจับเวลาแบบเก่าฉันรู้สึกไม่สบายใจเล็กน้อยที่จะใส่อักขระที่ไม่ใช่ ASCII ในไฟล์ต้นฉบับ ที่กล่าวมานี้doc แอปเปิ้ลกล่าวว่าเริ่มต้นจาก 10.4 UTF-16 @"..."สายอยู่ภายในตกลง อย่างใด GCC ดูเหมือนว่าจะถูกต้องแปลงไฟล์แหล่งที่มาในละติน-1 เข้า UTF-16 ในไบนารี แต่ฉันคิดว่ามันปลอดภัยที่สุดที่จะใช้ตัวอักษร ASCII 7 NSLocalizedStringบิตเฉพาะภายในรหัสแหล่งที่มาและการใช้งาน


2

ฉันคิดว่าตัวละครที่เน้นเสียงของคุณกำลังสลัดสิ่งต่างๆออกไป พวกเขาจะไม่ถูกจัดการโดย -stringByAddingPercentEscapesUsingEncoding:.


2

NSURL URLWithString: @ "" จะคืนค่า nil หาก URL ไม่เป็นไปตาม RFC 2396 และต้องมีการ Escape

หากคุณอ่านผ่านrfc2396ในลิงค์คุณจะได้รับรายละเอียดมากมาย

ฉันพบไซต์ที่ยอดเยี่ยมสำหรับการตรวจสอบว่าตัวละครที่กระทำผิดอยู่ที่ใดเลือกตัวเลือกเส้นทางสำหรับ URL

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


0

URLWithString: call จะส่งคืนค่า nil หากสตริงที่ส่งผ่านไปนั้นผิดรูปแบบ เนื่องจาก NSURL ส่งคืนค่า nil สำหรับ URL ที่มีรูปแบบไม่ถูกต้อง NSLog สตริงของคุณและตั้งค่าเบรกพอยต์เพื่อดูว่าอะไรถูกส่งไปยังวิธีการสร้าง NSURL ของคุณ หาก URLWithString ของคุณทำงานร่วมกับค่าที่เข้ารหัสยากนั่นเป็นข้อพิสูจน์เพิ่มเติมว่าสิ่งที่คุณส่งผ่านนั้นผิดรูปแบบ ดู


0

UPDATE : เนื่องจาก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


-1

คุณสามารถใช้ NSURL ได้โดยตรงโดยไม่ต้องใช้ NSString

//.h ไฟล์

@interface NewsBrowser : UIViewController {

    UIWebView *webView;
    NSURL *NewsUrl;

}

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

@property(nonatomic,assign)NSURL *NewsUrl;

@end

//.m ไฟล์

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

และฉันส่ง URL จากมุมมองอื่น (โดยใช้ตัวแปร NewsUrl) ไปยังมุมมองนี้

ลองมัน.


คำตอบนี้ไม่ได้ตอบคำถามเลยซึ่งถามว่าเหตุใด URLWithString: จึงคืนค่าศูนย์ (นอกจากนี้คุณยังไม่ได้แสดงวิธีการเปลี่ยนสตริงเป็น URL)
ArtOfWarfare
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.