2009-05-27 21 views
8

मैं एक php फ़ाइलएन्कोडिंग रिक्त स्थान

NSString *urlstr = [[NSString alloc] initWithFormat:@"http://server.com/file.php?name=%@&tags=%@&entry=%@",nameField.text, tagsField.text, dreamEntry.text]; 

जब मैं urlstr लॉग इन करने के पैरामीटर के रूप में UITextView या UITextField की सामग्री भेजने के लिए कोशिश कर रहा हूँ, url स्वरूप ठीक बस के रूप में लंबा है चूंकि UITextView या UITextField में रिक्त स्थान नहीं हैं। मैं रिक्त स्थान को% 20 में बदलने के बारे में कैसे जाउंगा?

संपादित

यहां वर्तमान में कोड है, जो न केवल दुर्घटनाओं है, लेकिन यूआरएल ठीक से एन्कोडिंग नहीं है।

नाम = जॉन डो & टैग = आवर्ती दुःस्वप्न & प्रविष्टि = परीक्षण परीक्षण परीक्षण

को

नाम बदल जाती है = जॉन -1844684964oe & टैग = recurringightmare & प्रविष्टि = परीक्षण 4.214929e-307sting -1.992836e + 00sting

- (IBAction)sendButtonPressed:(id)sender 
{ 

    NSString *urlString = [[NSString alloc] initWithFormat:@"http://server.com/file.php?name=%@&tags=%@&entry=%@", nameField.text, tagsField.text, dreamEntry.text]; 

    NSString *encodedString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 

    NSURL *url = [[NSURL alloc] initWithString:encodedString]; 

    NSLog(encodedString); 

    NSLog(urlString); 

    [urlString release]; 
    [url release]; 
    [encodedString release]; 


} 

उत्तर

14

आपको यूआरएल से पूरी स्ट्रिंग से बचने की आवश्यकता नहीं है, तो आपको यूआरएल-गतिशील घटकों से बचने की आवश्यकता है।

NSString *urlStr = [NSString stringWithFormat:@"http://server.com/file.php?name=%@&tags=%@&entry=%@", 
         [nameField.text stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding], 
         [tagsField.text stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding], 
         [dreamEntry.text stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding], 
         nil]; 
NSURL *url = [NSURL URLWithString:urlStr]; 

दूसरे अंक का प्रयास करें अपने कोड के साथ (और बेशक अजीब मुद्रण के लिए कारण) आप NSLog के लिए सीधे स्ट्रिंग गुजर रहे हैं, इसलिए यह एक प्रारूप स्ट्रिंग के रूप में इलाज किया जा रहा है। आपको

NSLog(@"%@", encodedString); 

का उपयोग करने की आवश्यकता है। इससे उम्मीद के अनुसार इसे प्रिंट कर दिया जाएगा।

संपादित करें: आपके कोड के साथ एक तीसरा मुद्दा यह है कि आप ऑटोरेलेज्ड और स्वामित्व वाली वस्तुओं को मिश्रित कर रहे हैं, फिर अंत में उन्हें जारी कर रहे हैं। अपने द्वारा बनाई गई 3 ऑब्जेक्ट्स पर जाएं, और बाद में आप बाद में रिलीज़ करें। उनमें से एक को बाद में जारी नहीं किया जाना चाहिए क्योंकि यह एक विधि द्वारा उत्पादित किया गया था जो शब्दों, प्रतिलिपि या नए शब्दों से शुरू नहीं हुआ था। प्रश्न में वस्तु की पहचान करना पाठक को छोड़ दिया गया व्यायाम है।

+0

हेहे बिंदु ले लिया। धन्यवाद! – bcsantos

0

तो अपने URL और उपयोग कर सकते हैं:

NSString *urlStr = [[NSString alloc] initWithFormat:@"http://server.com/file.php?name=%@&tags=%@&entry=%@",nameField.text, tagsField.text, dreamEntry.text]; 

NSString *encStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
+0

पॉइंटर के लिए धन्यवाद :) – bcsantos

+0

एनपी ... उपरोक्त उत्तर वास्तव में अधिक सही है। Thx ... –

20

वास्तव में, पिछले जवाब के सभी कम से कम कुछ अशुद्धियां है, जो उपयोगकर्ता के कई समान मूल्यों के लिए सही ढंग से सर्वर

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 में उपयोगकर्ता इनपुट टेक्स्ट में & है, जो कि असंभव नहीं है। पिछले समाधानों के साथ, सर्वर को उस पाठ के समय उस वर्ण के बाद सभी पाठ खो जाएंगे, क्योंकि अनचाहे एम्परसैंड सर्वर द्वारा उस क्वेरी स्ट्रिंग जोड़ी के मान भाग को समाप्त करने के रूप में व्याख्या किया जाएगा।

+1

कुडोस। वर्तमान में "सही" उत्तर यह है कि हम सभी थोड़ा गलत देख सकते हैं। * हालांकि * ट्विटर एप पर पैरामीटर मानों से बचने के लिए इसका उपयोग करते समय, परिणाम खराब हो जाते हैं (वास्तव में केवल% वर्णों का एक गुच्छा)। यदि यह ट्विटर क्लाइंट की तरफ से डिकोडिंग में कोई समस्या है या नहीं, तो मुझे नहीं पता। यह CFURLCreateStringByAddingPercentEscapes() हालांकि का उपयोग करके किसी अन्य समाधान के साथ काम करता है। मुझे यहां से यह समाधान मिला: http://wiki.akosma.com/IPhone_URL_Schemes#Note_about_URL_Encoding_in_Objective-C – Jonny

+0

जो श्रेणी मैंने प्रदान की है उसका कार्यान्वयन वस्तुतः आपके द्वारा लिंक किए गए समाधान के समान है (यह भी भारी के लिए CFURLCreateStringByAddingPercentEscapes() का उपयोग करता है उठाना। मुख्य अंतर यह है कि समाधान अच्छी तरह से लपेटा नहीं जाता है)। यदि आपको उपर्युक्त श्रेणी में कोई समस्या है, तो मुझे संदेह है कि आप दोनों स्ट्रिंगबैडिंगआरएफसी 3875PercentEscapesUsingEncoding() और सामान्य NSString स्ट्रिंग ByAddingPercentEscapesUsingEncoding() को एक ही स्ट्रिंग पर लागू कर रहे थे, जो खराब है, क्योंकि यह यूआरएल से बचने के लिए बेवकूफ़ नहीं है, इसलिए आप भागने से बचने लगते हैं (उदाहरण के लिए% 20% 2520 बन जाता है)। – barrycburton

+0

असल में, यह समाधान * लगभग * सही है। अर्थात्, [self stringByAddingPercentEscapesUsingEncoding: एन्कोडिंग] पर कॉल अनावश्यक है, क्योंकि CFURLCreateStringByAddingPercentEscapes() आपके लिए पहले से ही ऐसा करेगा।तो विधि बन जाती है: - (एनएसएसटींग *) stringByAddingRFC3875PercentEscapesUsingEncoding: (NSStringEncoding) एन्कोडिंग { CFStringEncoding cfEncoding = CFStringConvertNSStringEncodingToEncoding (एन्कोडिंग); NSString * rfcEscaped = (NSString *) CFURLCreateStringByAddingPercentEscapes (NULL, (CFStringRef) स्वयं, नल, (CFStringRef) @ "; /?: @ & = $ + {} <>,", CfEncoding); वापसी [आरएफसी से बच निकला autorelease]; } – lensovet

संबंधित मुद्दे