swift - NSURLComponents के साथ% 2B में एन्कोड कैसे करें




encoding url-encoding (3)

मैं NSURLComponents का उपयोग कर रहा हूं और मुझे क्वेरी मान सही ढंग से एन्कोड करने के लिए नहीं मिल सकता है। मुझे %2B + रूप में प्रतिनिधित्व करने के लिए अंतिम URL की आवश्यकता है

let baseUrl = NSURL(string: "http://www.example.com")    
let components = NSURLComponents(URL: baseUrl, resolvingAgainstBaseURL: true)
components.queryItems = [ NSURLQueryItem(name: "name", value: "abc+def") ]
XCTAssertEqual(components!.string!, "http://www.example.com?connectionToken=abc%2Bdef")

अनुत्तीर्ण होना!

आउटपुट बराबर है:

http://www.example.com?connectionToken=abc+def 

नहीं

http://www.example.com?connectionToken=abc%2Bdef

मैंने कई रूपों की कोशिश की है और मैं इसे आउटपुट %2B पर बिल्कुल भी नहीं पा सकता


यह एक ऐप्पल बग है इसके बजाय उपयोग करें

NSString -stringByAddingPercentEncodingWithAllowedCharacters:

साथ में

NSCharacterSet +URLQueryAllowedCharacterSet

रडार 24076063 से मेरा जवाब यह बताता है कि यह कैसे काम करता है (पाठ की थोड़ी सफाई के साथ):

'+' वर्ण क्वेरी घटक में कानूनी है इसलिए इसे प्रतिशत-एन्कोडेड होने की आवश्यकता नहीं है।

कुछ सिस्टम '+' को एक स्थान के रूप में उपयोग करते हैं और '+' को प्लस चरित्र की आवश्यकता होती है, जो प्रतिशत-एन्कोडेड होती है। हालांकि, उस तरह की दो चरण एन्कोडिंग (कनवर्टिंग प्लस को% 2 बी पर हस्ताक्षर करने और फिर स्थान को प्लस साइन करने के लिए परिवर्तित करना) त्रुटियों की संभावना है क्योंकि यह आसानी से एन्कोडिंग समस्याओं की ओर जाता है यह भी टूट जाता है कि यूआरएल सामान्यीकृत है (यूआरएल की वाक्यविन्यास सामान्यीकरण में सभी अनावश्यक प्रतिशत-एन्कोडिंग हटाने शामिल हैं - आरएफसी 3 9 6 खंड 6.2.2.2 देखें)।

इसलिए, अगर आपको उस सर्वर की वजह से उस व्यवहार की आवश्यकता है, जिससे आपका कोड बात कर रहा है, तो आप अपने आप को अतिरिक्त परिवर्तन (एस) को संभाल लेंगे यहां कोड का स्निपेट दिया गया है जो दर्शाता है कि आपको दोनों तरीकों से क्या करना है:

NSURLComponents *components = [[NSURLComponents alloc] init];
NSArray *items = [NSArray arrayWithObjects:[NSURLQueryItem queryItemWithName:@"name" value:@"Value +"], nil];
components.queryItems = items;
NSLog(@"URL queryItems: %@", [components queryItems]);
NSLog(@"URL string before: %@", [components string]);

// Replace all "+" in the percentEncodedQuery with "%2B" (a percent-encoded +) and then replace all "%20" (a percent-encoded space) with "+"
components.percentEncodedQuery = [[components.percentEncodedQuery stringByReplacingOccurrencesOfString:@"+" withString:@"%2B"] stringByReplacingOccurrencesOfString:@"%20" withString:@"+"];
NSLog(@"URL string after: %@", [components string]);

// This is the reverse if you receive a URL with a query in that form and want to parse it with queryItems
components.percentEncodedQuery = [[components.percentEncodedQuery stringByReplacingOccurrencesOfString:@"+" withString:@"%20"] stringByReplacingOccurrencesOfString:@"%2B" withString:@"+"];
NSLog(@"URL string back: %@", [components string]);
NSLog(@"URL queryItems: %@", [components queryItems]);

आउटपुट है:

URL queryItems: (
    "<NSURLQueryItem 0x100502460> {name = name, value = Value +}"
)

URL string before: ?name=Value%20+

URL string after: ?name=Value+%2B

URL string back: ?name=Value%20+

URL queryItems: (
    "<NSURLQueryItem 0x1002073e0> {name = name, value = Value +}"
)

जैसा कि अन्य उत्तरों का उल्लेख है, डिफ़ॉल्ट रूप से "+" आईओएस पर एन्कोड नहीं किया गया है लेकिन अगर आपके सर्वर को यह एन्कोड करने की आवश्यकता है, तो इसे कैसे करें:

var comps = URLComponents(url: self, resolvingAgainstBaseURL: true)
comps?.queryItems = [URLQueryItem(name: "name", value: "abc+def")]
comps?.percentEncodedQuery = comps?.percentEncodedQuery?.replacingOccurrences(of: "+", with: "%2B")






url-encoding