2009-05-22 5 views
10

मैं एक समय क्षेत्र GET अनुरोध में ऑफसेट, जैसे के साथ एक टाइमस्टैम्प पारित करने के लिए की जरूरत है,एक इनकोडिंग प्लस (% 2 बी) के साथ एक NSURL बनाओ

2009-05-04T11: 22: 00 + 01: 00

यह दो तर्कों की तरह दिखता है "2009-05-04T11: 22: 00" और "01:00" प्राप्त करने वाली PHP स्क्रिप्ट (जिस पर मेरा कोई नियंत्रण नहीं है)।

NSURL धन चिह्नों एन्कोड नहीं करता, लेकिन अगर मैं स्ट्रिंग का उपयोग एक NSURL बनाने

2009-05-04T11: 22: 00% 2B01: 00

यूआरएल मैं अंत साथ शामिल हैं:

2009-05-04T11: 22: 00% 252B01: 00

कोई विचार है कि मैं अपने एन्कोडेड प्लस साइन को कैसे सुरक्षित रख सकता हूं या सिर्फ सादा एनएसआरएल को एन्कोडिंग से रोक सकता हूं?

उत्तर

13

मुझे UTF8 रूपांतरण कर रहा था, तो जगह क्या काम किया +% 2 बी के साथ साइन इन करें:

NSString *urlString = 
    [NSString stringWithFormat:@"%@/iphone/push/create?pn[token]=%@&pn[send_at]=%@", 
    kHTTPURL, appDelegate.deviceAPNToken, [dateTimeToUse description]]; 

urlString = 
    [[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding] 
    stringByReplacingOccurrencesOfString:@"+" withString:@"%2B"]; 
+0

मुझे समझ में नहीं आता कि यह सही जवाब कैसे है। सवाल पूछता है कि उचित NSURL ऑब्जेक्ट कैसे बनाएं। यदि इस स्ट्रिंग का उपयोग NSURL ऑब्जेक्ट बनाने के लिए किया जाता है, तो% sign को फिर से% 25 के रूप में एन्कोड किया जाएगा। कृपया स्पष्ट करें। –

+1

यह समस्या हल करता है। हालांकि यह सही समाधान नहीं है क्योंकि यह केवल '+' से संबंधित है और अन्य पात्रों को एन्कोड करने की आवश्यकता नहीं है। –

+0

यह मेरे लिए काम नहीं किया। इसके बजाय, मैंने urlString बनाने से पहले रिक सैंटोस के उत्तर का उपयोग करके टाइमस्टैम्प को एन्कोड किया। मेरे अनुभव में, मैंने कभी भी किसी को पैरामीटर नाम, स्कीमा, डोमेन या यूआरएल के अन्य हिस्सों को एन्कोड करने की आवश्यकता नहीं देखी है। इसलिए, पैरामीटर मान अलग से एन्कोड करना हमेशा सर्वोत्तम होता है। लेकिन, यह एक अच्छा काम होगा जो एक यूआरएल को तोड़ देगा, इसे सही ढंग से एन्कोड किया जाएगा, फिर इसे एक साथ रखेगा। मुझे लगता है कि stringByAddingPercentEscapesUsingEncoding ने ऐसा किया, लेकिन स्पष्ट रूप से यह + संकेतों जैसे मामलों में विफल रहता है। – Brainware

2

उस पाठ पर NSString की stringByAddingPercentEscapesUsingEncoding: विधि का उपयोग करें जिसे आप तर्क के रूप में शामिल करना चाहते हैं।

जैसा कि इसके नाम से तात्पर्य है, विधि रिसीवर के एक यूआरएल-सुरक्षित संस्करण वाले ऑटो-रिलीज़ स्ट्रिंग को बदलेगी।

+0

मैंने कोशिश की - यह '+' से '% 2B' में परिवर्तित हो जाती है। NSURL फिर '%' को एन्कोड करता है ताकि आप '% 252B' – edoloughlin

+0

के साथ समाप्त हो जाएं, शायद आप URL के साथ कुछ गलत कर रहे हैं। आपको NSURL के 'URLWithString:' का उपयोग करने की आवश्यकता है। –

+0

और सुनिश्चित करें कि आप उसी विधि पर दो बार उस विधि को नहीं बुला रहे हैं, अन्यथा यह कॉल करेगा, यह आपकी परिणामी स्ट्रिंग को दो बार एन्कोड करेगा, इस प्रकार% 25 को% एन्कोड कर देगा। यह भी सुनिश्चित करें कि आप हर जगह NSUTF8Encoding का उपयोग कर रहे हैं। –

2

सोचा कि मैं अपने कामकाज को उत्तर के रूप में भी प्रदान कर सकता हूं, क्योंकि मुझे नहीं लगता कि मूल समस्या का कोई अच्छा समाधान है।

प्लस साइन (+) एक यूआरएल में पूरी तरह से मान्य है, इसलिए मेरा समाधान समय को जीएमटी में परिवर्तित करना और स्ट्रिंग से टाइमज़ोन/डीएसटी ऑफसेट को हटाना था। मैं इसे सेकेंड के मान को निर्धारित करने के लिए पाठक के लिए एक अभ्यास के रूप में छोड़ दूंगा, मेरे मामले में, नीचे दिए गए FromGMT नीचे, यह हमेशा एक जैसा है क्योंकि मुझे केवल वेब सर्वर द्वारा उत्पन्न टाइमस्टैम्प में रूचि है।

NSString *gmtWhen = [[self descriptionWithCalendarFormat:nil 
          timeZone:[NSTimeZone 
          timeZoneForSecondsFromGMT:secondsFromGMT 
        ] locale:nil] stringByReplacingOccurrencesOfString:@" +0000" withString:@""]; 
3

स्ट्रिंग यूआरएल इनकोडिंग किया जाना चाहिए।

NSString + Additions.h

@interface NSString (Additions) 

- (NSString *)stringByURLEncoding; 

NSString + परिवर्धन:

यहाँ NSString के लिए एक वर्ग में मदद मिलेगी है।मीटर

#import "NSString+Additions.h" 

@implementation NSString (Additions) 

- (NSString *)stringByURLEncoding { 
    return (__bridge NSString *)CFURLCreateStringByAddingPercentEscapes(NULL, 
                  (CFStringRef)self, 
                  NULL, 
                  (CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ", 
                  CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding)); 
} 
0

एनकोड कोड के नीचे का उपयोग कर

NSString * परिणाम = (NSString *) CFURLCreateStringByAddingPercentEscapes द्वारा आप स्ट्रिंग (शून्य, (CFStringRef) स्वयं, शून्य, (CFStringRef) @ "+", kCFStringEncodingUTF8) ;

इस सांकेतिक शब्दों में बदलना होगा आप स्ट्रिंग, जबकि पोस्ट विधि में डेटा

0

इनकोडिंग करने के लिए प्लस (% 2 बी) (यह सब वर्णों के साथ काम करता है) पोस्टिंग जो% 2 बी द्वारा की + प्रतिस्थापन पाएगा की +

रूप CFURLCreateStringByAddingPercentEscapes का उपयोग
/** 
get parameterized url from url and query parameters. 
*/ 
+(NSString *)getParameterizedUrl:(NSString *)url withParameters:(NSDictionary *)queryDictionary 
{ 
    NSMutableArray *mutablePairs = [NSMutableArray array]; 
    for (NSString *key in queryDictionary) { 
     [mutablePairs addObject:[NSString stringWithFormat:@"%@=%@", CTPercentEscapedQueryStringKeyFromStringWithEncoding(key, NSUTF8StringEncoding), CTPercentEscapedQueryStringValueFromStringWithEncoding(queryDictionary[key], NSUTF8StringEncoding)]]; 
    } 

    return [[NSString alloc]initWithFormat:@"%@?%@",url,[mutablePairs componentsJoinedByString:@"&"]]; 
} 

static NSString * const kCharactersToBeEscapedInQueryString = @":/?&=;[email protected]#$()',*"; 

static NSString * CTPercentEscapedQueryStringKeyFromStringWithEncoding(NSString *string, NSStringEncoding encoding) { 
    static NSString * const kCharactersToLeaveUnescapedInQueryStringPairKey = @"[]."; 

    return (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (__bridge CFStringRef)string, (__bridge CFStringRef)kCharactersToLeaveUnescapedInQueryStringPairKey, (__bridge CFStringRef)kCharactersToBeEscapedInQueryString, CFStringConvertNSStringEncodingToEncoding(encoding)); 
} 

static NSString * CTPercentEscapedQueryStringValueFromStringWithEncoding(NSString *string, NSStringEncoding encoding) { 
    return (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (__bridge CFStringRef)string, NULL, (__bridge CFStringRef)kCharactersToBeEscapedInQueryString, CFStringConvertNSStringEncodingToEncoding(encoding)); 
} 

और जब URLComponents (स्विफ्ट 3) का उपयोग कर के रूप में

NSMutableDictionary *params = [[NSMutableDictionary alloc]init]; 
[params setObject:@"2009-05-04T11:22:00+01:00" forKey:@"timestamp"]; 

NSString *urlString = [self getParameterizedUrl:@"http://www.example.com" withParameters:params]; 
NSURL *url = [NSURL URLWithString:[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; 
0

समाधान अपने कोड में उपयोग करें:

var params = ["email": "[email protected]", "name": "John Brown"] 
var components = URLComponents(string: "http://www.example.com")! 
components.path = "/login" 
components.queryItems = params.map { URLQueryItem(name: $0, value: $1) } 

let url_NoFix = components.url! 
// http://www.example.com/login?name=John%20Brown&[email protected] 

let cs = CharacterSet(charactersIn: "+").inverted 
let q = components.percentEncodedQuery?.addingPercentEncoding(withAllowedCharacters: cs) 
components.percentEncodedQuery = q 

let url_Fixed = components.url! 
// http://www.example.com/login?name=John%20Brown&email=user%[email protected]