वास्तव में, पिछले जवाब के सभी कम से कम कुछ अशुद्धियां है, जो उपयोगकर्ता के कई समान मूल्यों के लिए सही ढंग से सर्वर
stringByAddingPercentEscapesUsingEncoding:
प्रतिशत के साथ संवाद नहीं होता टेक्स्ट फ़ील्ड में पाठ प्रदान की शामिल सभी पात्रों जो मान्य URL नहीं हैं निकल जाता है वर्ण। इस विधि को पूरे यूआरएल में एक बार लागू किया जाना चाहिए।
पिछले उत्तर का दावा है कि stringByAddingPercentEscapesUsingEncoding:
कई स्क्रिप्टिंग भाषाओं में यूआरएल बिल्डिंग कक्षाओं की तरह काम करता है, जहां आपको इसे संपूर्ण यूआरएल स्ट्रिंग पर लागू नहीं करना चाहिए, लेकिन ऐसा नहीं है। कोई भी आसानी से अनदेखा &
एस और ?
एस के लिए अपने आउटपुट की जांच करके इसे सत्यापित कर सकता है। तो पूरी स्ट्रिंग पर लागू होना ठीक है, लेकिन यह आपके 'गतिशील' यूआरएल सामग्री पर लागू करने के लिए पर्याप्त नहीं है।
पिछला उत्तर सही है कि आपको अपने CGI क्वेरी स्ट्रिंग में जाने वाले नामों और मानों पर कुछ और काम करना होगा। चूंकि सीजीआई आरएफसी 3875 द्वारा निर्दिष्ट है, इसे अक्सर आरएफसी 3875 प्रतिशत भागने के रूप में जाना जाता है।यह सुनिश्चित करें कि आपके नाम और मान अक्षर हैं जो मान्य URL वर्ण हैं, लेकिन जो यूआरएल (;
, ?
, :
, @
, &
, =
, $
, +
, {
, }
, <
के अन्य भागों में महत्वपूर्ण हैं शामिल नहीं है बनाता है , >
, और ,
)
हालांकि, यह सुनिश्चित करने के लिए कि स्ट्रिंग में सभी वर्ण वैध URL वर्ण हैं, पूर्ण स्ट्रिंग पर सादा URL प्रतिशत से बचने के लिए भी बहुत महत्वपूर्ण है। जबकि आप अपने उदाहरण में नहीं हैं, आम तौर पर स्ट्रिंग के 'स्थैतिक' भाग में वर्ण हो सकते हैं जो वैध URL वर्ण नहीं हैं, इसलिए आपको उनसे बचने की आवश्यकता है।
दुर्भाग्यवश, NSString
हमें आरएफसी 3875 महत्वपूर्ण पात्रों से बचने की शक्ति नहीं देता है, इसलिए हमें ऐसा करने के लिए CFString
में डुबोना होगा। जाहिर है CFString
एक दर्द उपयोग कर रहा है तो मैं आम तौर पर तो जैसे NSString
पर एक Category
जोड़ें:
@interface NSString (RFC3875)
- (NSString *)stringByAddingRFC3875PercentEscapesUsingEncoding:(NSStringEncoding)encoding;
@end
@implementation NSString (RFC3875)
- (NSString *)stringByAddingRFC3875PercentEscapesUsingEncoding:(NSStringEncoding)encoding {
CFStringEncoding cfEncoding = CFStringConvertNSStringEncodingToEncoding(encoding);
NSString *rfcEscaped = (NSString *)CFURLCreateStringByAddingPercentEscapes(
NULL,
(CFStringRef)self,
NULL,
(CFStringRef)@";/?:@&=$+{}<>,",
cfEncoding);
return [rfcEscaped autorelease];
}
@end
स्थान पर इस Category
के साथ, मूल समस्या को सही ढंग से साथ हल किया जा सकता है:
NSString *urlEscapedBase = [@"http://server.com/file.php" stringByAddingPercentEscapesUsingEncoding:
NSUTF8StringEncoding];
NSString *rfcEscapedName = [nameField.text stringByAddingRFC3875PercentEscapesUsingEncoding:
NSUTF8StringEncoding];
NSString *rfcEscapedTags = [tagsField.text stringByAddingRFC3875PercentEscapesUsingEncoding:
NSUTF8StringEncoding];
NSString *rfcEscapedEntry = [dreamEntry.text stringByAddingRFC3875PercentEscapesUsingEncoding:
NSUTF8StringEncoding];
NSString *urlStr = [NSString stringWithFormat:@"%@?name=%@&tags=%@&entry=%@",
urlEscapedBase,
rfcEscapedName,
rfcEscapedTags,
rfcEscapedEntry];
NSURL *url = [NSURL URLWithString:urlStr];
यह है थोड़ा परिवर्तनीय भारी बस अधिक स्पष्ट हो। यह भी ध्यान रखें कि stringWithFormat:
को प्रदान की गई परिवर्तनीय सूची nil
समाप्त नहीं होनी चाहिए। स्वरूप स्ट्रिंग चर के सटीक संख्या का वर्णन करती है जिसे इसका पालन करना चाहिए। साथ ही, तकनीकी रूप से क्वेरी स्ट्रिंग नामों (नाम, टैग, एंट्री, ..) के लिए स्ट्रिंग्स को निश्चित रूप से stringByAddingPercentEscapesUsingEncoding:
के माध्यम से चलाया जाना चाहिए, लेकिन इस छोटे से उदाहरण में हम आसानी से देख सकते हैं कि उनमें कोई अमान्य URL वर्ण नहीं हैं।
यह देखने के लिए कि पिछले समाधान गलत क्यों हैं, कल्पना करें कि dreamEntry.text
में उपयोगकर्ता इनपुट टेक्स्ट में &
है, जो कि असंभव नहीं है। पिछले समाधानों के साथ, सर्वर को उस पाठ के समय उस वर्ण के बाद सभी पाठ खो जाएंगे, क्योंकि अनचाहे एम्परसैंड सर्वर द्वारा उस क्वेरी स्ट्रिंग जोड़ी के मान भाग को समाप्त करने के रूप में व्याख्या किया जाएगा।
हेहे बिंदु ले लिया। धन्यवाद! – bcsantos