2010-04-07 14 views
12

के साथ एक स्ट्रिंग URLEncoding मैं उद्देश्य-सी से एक GET अनुरोध बनाने के लिए एक स्ट्रिंग को एन्कोड करने की कोशिश कर रहा हूं।उद्देश्य-सी

NSString *params = @"'Decoded data!'/foo.bar:baz"; 

NSRunAlertPanel(@"Error", [params urlEncoded], @"OK", nil, nil); 

यह तो पहली बार मैं इसे चलाने मैं वापस

1606410046ecoded   1606410784ata2270.000000foo.bar0X1.001716P-1042baz 

संवाद बॉक्स से प्राप्त श्रेणी NSString

-(NSString *) urlEncoded 
{ 
    NSString *encoded = (NSString *)CFURLCreateStringByAddingPercentEscapes(
                NULL, 
                (CFStringRef)self, 
                NULL, 
                (CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ", 
                kCFStringEncodingUTF8); 
    return encoded; 
} 

का विस्तार है।

के तुरंत बाद मैं इसे फिर से चलाने मैं अगर मैं इसे फिर से चलाने के लिए इसे वापस पहले एक को जाता है तो फिर इस

1606410046ecoded   1606410944ata227369374562920703448982951250259562309742470533728899744288431318481119278377104028261651081181287077973859930826299575521579020410425419424562236383226511593137467590082636817579938932512039895040.000000foo.bar0X1.66E6156303225P+771baz 

मिलता है। यह वास्तव में अजीब है।

यदि पैराम्स को "&" पर सेट किया गया है या @ "" मैं बस संवाद बॉक्स में "2" (w/o उद्धरण) वापस प्राप्त करता हूं।

क्या एक तरीका है कि मैं अलर्ट संवाद में% संकेत दिखा सकता हूं?

धन्यवाद

+1

क्यों आप इसे बुला रहे हैं दो बार और आप इसे एक चेतावनी में बदलने के बजाय अपने आउटपुट को लॉग क्यों नहीं कर रहे हैं? –

उत्तर

23

मुझे लगता है कि NSAlert स्ट्रिंग प्रारूप विनिर्देशक जो यादृच्छिक डेटा से भरा जा रहा है के रूप में % पात्रों की व्याख्या कर रहा है। बस NSLog उत्पादन और यह ठीक है:

%27Decoded%20data%21%27%2Ffoo.bar%3Abaz 

इसके अलावा, आप अपने -urlEncoded श्रेणी विधि में एक स्मृति रिसाव है। आप Create युक्त सीएफ फ़ंक्शन का उपयोग करके स्ट्रिंग बनाते हैं ताकि आप इसे जारी करने के लिए ज़िम्मेदार हों।

-(NSString *) urlEncoded 
{ 
    CFStringRef urlString = CFURLCreateStringByAddingPercentEscapes(
                NULL, 
                (CFStringRef)self, 
                NULL, 
                (CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ", 
                kCFStringEncodingUTF8); 
    return [(NSString *)urlString autorelease]; 
} 
+0

स्मृति रिसाव चेतावनी के लिए धन्यवाद। दरअसल समस्या एनएसएलओजी के साथ भी बनी रहती है। मैंने नीचे अपनी प्रतिक्रिया में विस्तृत स्ट्रिंग में %% के साथ% को प्रतिस्थापित करके इसे ठीक किया है। – Chris

+3

इसका मतलब है कि आप शायद इस तरह 'एनएसएलओजी' का उपयोग कर रहे हैं: 'एनएसएलओजी (एनकोडेड) '। 'NSLog' का पहला तर्क एक प्रारूप स्ट्रिंग है, न कि एक सादा स्ट्रिंग। किसी भी स्ट्रिंग प्रारूप प्लेसहोल्डर को उन तर्कों के साथ प्रतिस्थापित किया जाएगा जो अनुसरण करते हैं, जो उस मामले में अपरिभाषित हैं। आपको इस तरह की स्ट्रिंग को लॉग इन करना होगा: 'NSLog (@"% @ ", एन्कोडेड);'। –

+1

'रिटर्न [एनएसएमके कोलेलेबल (urlString) autorelease] का उपयोग करके;' यह भी जीसी-क्लीन बनाता है, और कास्ट से बचाता है। –

1

ठीक है यह पता चला कि यह एक nonissue था। इसे सही ढंग से एन्कोड किया जा रहा था क्योंकि मैंने सर्वर लॉग की जांच की थी और ऐसा लगता है कि अनुरोध पैराम एन्कोड किए गए थे।

और डायलॉग बॉक्स में एन्कोडेड स्ट्रिंग को सही तरीके से प्रदर्शित करने के लिए, मैंने तथ्य के बाद %% के साथ% के सभी उदाहरणों को प्रतिस्थापित कर दिया।

6

मैंने अपना यूआरएल एन्कोडर उपयोगिता वर्ग सोर्स किया है जो समझदारी से यूआरएल के डोमेन और पथ हिस्से को छोड़ देता है (स्लैश एन्कोडिंग से बचने के लिए ...) और केवल प्रतिशत अनुक्रमों से बचें जो 2- अंक हेक्स कोड (इस तरह के पर्सेंट के डबल एन्कोडिंग को रोकने के लिए:% 20 ->% 2520)।

यह 10,000 से अधिक यूआरएल के खिलाफ परीक्षण किया गया है और यह बहुत मजबूत और कलाकार है।

आप यहां मेरे कार्यान्वयन (और डाउनलोड) के बारे में अधिक जान सकते हैं ... http://jayfuerstenberg.com/devblog/url-encoding-in-objective-c

2

बल्कि autorelease, अब उपलब्ध नहीं है जो जब एआरसी का उपयोग करने से, एक स्ट्रिंग गुजर और का उपयोग कर CFBridgingRelease करके अपने उदाहरण विधि बनाने के लिए:

- (NSString *)urlEncodeWithString: (NSString*)string 
{ 
    CFStringRef urlString = CFURLCreateStringByAddingPercentEscapes(
                    NULL, 
                    (CFStringRef)string, 
                    NULL, 
                    (CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ", 
                    kCFStringEncodingUTF8); 
    return (NSString *)CFBridgingRelease(urlString); 
} 
0

मेरी राय में सबसे आसान तरीका सुविधाजनक तरीका आपूर्ति का उपयोग करना है NSString (NSURLUtilities) श्रेणी के साथ

मेरे कार्यान्वयन:

- (NSString *) urlEncodedString 
{ 
    NSString *result = [self stringByReplacingOccurrencesOfString:@" " withString:@"+"]; 
    result = [result stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
    return result; 
} 
+0

काम नहीं करता है। अनुवाद करता है "यह मेरा + कथन है। समझे?" "यह + है + मेरा +++ कथन। + मिला + यह?" इसके बजाय "यह + है + मेरा +% 2 बी + कथन। + मिला + यह% 3 एफ"। – Volomike