2008-09-05 8 views
6

में एक गैर-मानक URL खुलने का एक आवेदन है कि मैं मैं कुछ कोड इस तरह है लिख रहा हूँ में:एक कोको अनुप्रयोग

NSWorkspace* ws = [NSWorkspace sharedWorkspace]; 
NSString* myurl = @"http://www.somewebsite.com/method?a=%d"; 

NSURL* url = [NSURL URLWithString:myurl]; 

[ws openURL:url]; 

मुख्य अंतर यह जा रहा है कि myurl कहीं मेरे नियंत्रण से बाहर से आता है। यूआरएल में% d नोट करें जो पूरी तरह से सही नहीं है और इसका मतलब है कि URLWithString विफल रहता है, शून्य लौटा रहा है।

इसे संभालने का "सही" तरीका क्या है? क्या मुझे स्ट्रिंग को पार्स करने और तर्कों को सही तरीके से एन्कोड करने की आवश्यकता है? या कोको में कुछ चालाक तरीका है जो मेरे लिए कड़ी मेहनत करता है?

उत्तर

8

मैं अगर यह ठीक है सुनिश्चित करें कि आप जो खोज रहे हैं नहीं कर रहा हूँ, लेकिन वहाँ NSString में एक विधि को एक ऐसे URL स्वच्छ जाएगा:

stringByAddingPercentEscapesUsingEncoding:

2

मुझे लगता है कि यहां व्यवहार सही है, क्योंकि% d एक यूआरएल का वैध घटक नहीं है (% बच निकला है, लेकिन उम्मीद है कि दो हेक्स वर्णों का पालन करना होगा)।

आप यूआरएल को यूआरएल एन्कोड नहीं कर सकते हैं जैसा कि आपको दिया गया है, क्योंकि वह/एस और एस को भी एन्कोड करेगा, जिसे आप नहीं चाहते हैं।

तो सवाल यह है कि, यहां सही व्यवहार क्या है?

शायद

आप इसे में तब्दील किया जा करने के लिए चाहते हो जाएगा ...

http://www.somewebsite.com/method?a=%25d 

(यानी% एक यूआरएल में% की इनकोडिंग संस्करण के लिए एनकोड है, इसलिए जब विधि इनपुट हो जाता है, यह एक के रूप में देखता % d पर सेट किया जा रहा है)

मुझे नहीं लगता कि कोई लाइब्रेरी फ़ंक्शन है जो आपके लिए ऐसी चीज करेगा, क्योंकि ऐसा करने के लिए कोई 'सही' तरीका नहीं है। वह बारे में केवल सही बात आप कर सकते हैं, एक त्रुटि संदेश लौट कह यूआरएल आप दिए गए अमान्य (URLWithString है बस के रूप में)


है आप इनपुट को संभालने के लिए कोशिश करना चाहता है तो है मुझे लगता है कि आप की आवश्यकता होगी यूआरएल को किसी भी% प्रतीकों के लिए खोजें जो तुरंत दो हेक्स वर्णों के बाद नहीं होते हैं, और उसके बाद उस मामले में% 25 के साथ% को प्रतिस्थापित करें। यह एक नियमित अभिव्यक्ति के साथ काफी संभव होना चाहिए, हालांकि मुझे संदेह है कि कुछ अतिरिक्त जटिलताओं हो सकती हैं यदि आपके यूआरएल ASCII चरित्र सेट के बाहर वर्णों के एन्कोडेड संस्करणों को शुरू करते हैं।

1

दुर्भाग्य से आप अधिक चालाक होने की जरूरत है क्या एप्पल द्वारा प्रदान की जाती है:

stringByAddingPercentEscapesUsingEncoding: 

यह सब अमान्य URL वर्ण से बचें जाएगा ताकि "http://foo.com/hey%20dude/" है, जो वैध है, "http://foo.com/ हो जाता है हे% 2520dud/", जो हम नहीं चाहते हैं।

सेब प्रलेखन के अनुसार: http://developer.apple.com/library/mac/documentation/CoreFOundation/Reference/CFURLRef/Reference/reference.html#//apple_ref/c/func/CFURLCreateStringByAddingPercentEscapes

मैं ऐसे आंशिक एन्कोडिंग के साथ लोगों (यानी "के रूप में http://foo.com/hey एक NSURL श्रेणी जो सही काम करता है और अजीब तार के साथ काम करता है बनाया दोस्त/i % 20do% 20it/")।

@interface NSURL (SmartEncoding) 
+ (NSURL *)smartURLWithString:(NSString *)str; 
@end 

@implementation NSURL (SmartEncoding) 

+ (NSURL *)smartURLWithString:(NSString *)str 
{ 
    CFStringRef preprocessed = CFURLCreateStringByReplacingPercentEscapesUsingEncoding(NULL, (CFStringRef)str, CFSTR(""), kCFStringEncodingUTF8); 
    if (!preprocessed) 
     preprocessed = CFURLCreateStringByReplacingPercentEscapesUsingEncoding(NULL, (CFStringRef)str, CFSTR(""), kCFStringEncodingASCII); 

    if (!preprocessed) 
     return [NSURL URLWithString:str]; 

    CFStringRef sanitized = CFURLCreateStringByAddingPercentEscapes(NULL, preprocessed, NULL, NULL, kCFStringEncodingUTF8); 
    CFRelease(preprocessed); 
    NSURL *result = (NSURL*)CFURLCreateWithString(NULL, sanitized, NULL); 
    CFRelease(sanitized); 
    return [result autorelease]; 
} 

@end 

यह UTF8 स्ट्रिंग एन्कोडेड और ASCII लोगों के साथ ठीक काम करता है:

यहाँ कोड है।