उद्देश्य-सी और स्विफ्ट URL एन्कोडिंग


137

मेरे पास NSStringऐसा है:

http://www.

लेकिन मैं इसे रूपांतरित करना चाहता हूं:

http%3A%2F%2Fwww.

मैं यह कैसे कर सकता हूँ?


1
मेरे पास एक एन्क्रिप्टेड स्ट्रिंग है ùÕ9y^VêÏÊEØ®.ú/V÷ÅÖêú2Èh~- नीचे दिए गए समाधानों में से कोई भी इसे संबोधित नहीं करता है!
महेंद्र लिया

जवाबों:


324

अपने इच्छित पात्रों से बचने के लिए थोड़ा और काम करना होगा।

उदाहरण कोड

iOS7 और ऊपर:

NSString *unescaped = @"http://www";
NSString *escapedString = [unescaped stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet]];
NSLog(@"escapedString: %@", escapedString);

NSLog उत्पादन:

escapedString: http% 3A% 2F% 2Fwww

निम्नलिखित उपयोगी URL एन्कोडिंग वर्ण सेट हैं:

URLFragmentAllowedCharacterSet  "#%<>[\]^`{|}
URLHostAllowedCharacterSet      "#%/<>?@\^`{|}
URLPasswordAllowedCharacterSet  "#%/:<>?@[\]^`{|}
URLPathAllowedCharacterSet      "#%;<>?[\]^`{|}
URLQueryAllowedCharacterSet     "#%<>[\]^`{|}
URLUserAllowedCharacterSet      "#%/:<>?@[\]^`

उपरोक्त सभी को मिलाकर एक वर्ण बनाना:

NSCharacterSet *URLCombinedCharacterSet = [[NSCharacterSet characterSetWithCharactersInString:@" \"#%/:<>?@[\\]^`{|}"] invertedSet];

एक Base64 बनाना

Base64 वर्ण के मामले में:

NSCharacterSet *URLBase64CharacterSet = [[NSCharacterSet characterSetWithCharactersInString:@"/+=\n"] invertedSet];

स्विफ्ट 3.0 के लिए:

var escapedString = originalString.addingPercentEncoding(withAllowedCharacters:.urlHostAllowed)

स्विफ्ट के लिए 2.x:

var escapedString = originalString.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLHostAllowedCharacterSet())

नोट: stringByAddingPercentEncodingWithAllowedCharactersUTF-8 अक्षरों को एन्कोडिंग की आवश्यकता होगी।

पूर्व iOS7
कोर फाउंडेशन के साथ कोर फाउंडेशन का उपयोग कोर फाउंडेशन का उपयोग करें:

NSString *escapedString = (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(
    NULL,
   (__bridge CFStringRef) unescaped,
    NULL,
    CFSTR("!*'();:@&=+$,/?%#[]\" "),
    kCFStringEncodingUTF8));

एआरसी के बिना कोर फाउंडेशन का उपयोग करना:

NSString *escapedString = (NSString *)CFURLCreateStringByAddingPercentEscapes(
    NULL,
   (CFStringRef)unescaped,
    NULL,
    CFSTR("!*'();:@&=+$,/?%#[]\" "),
    kCFStringEncodingUTF8);

नोट: -stringByAddingPercentEscapesUsingEncodingसही एन्कोडिंग का उत्पादन नहीं करेगा, इस मामले में यह समान स्ट्रिंग को लौटाने वाली किसी भी चीज़ को एन्कोड नहीं करेगा।

stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding 14 चक्रों को एनकोड करता है:

`#% ^ {} [] | \" <> साथ ही अंतरिक्ष चरित्र प्रतिशत के रूप में बच गया।

testString:

" `~!@#$%^&*()_+-={}[]|\\:;\"'<,>.?/AZaz"  

encodedString:

"%20%60~!@%23$%25%5E&*()_+-=%7B%7D%5B%5D%7C%5C:;%22'%3C,%3E.?/AZaz"  

नोट: विचार करें कि क्या वर्णों का यह समूह आपकी आवश्यकताओं को पूरा करता है, यदि उन्हें आवश्यकतानुसार नहीं बदला जाए।

RFC 3986 वर्ण एन्कोडिंग की आवश्यकता है (% जोड़ा गया है क्योंकि यह एन्कोडिंग उपसर्ग वर्ण है):

"# $ & '() * +, /:!? = @ []%"

कुछ "अनारक्षित पात्र" अतिरिक्त रूप से एन्कोडेड हैं:

"\ n \ r \"% -। <> \ ^ _ `{|} ~ ~"


1
यह भी ध्यान दें कि आप NSString की -stringByAddingPercentEscapesUsingEncodingविधि का उपयोग कर सकते हैं ।
माइक वेलर

2
आह हाँ, अब मुझे कायरतापूर्ण stringByAddingPercentEscapesUsingEncodingव्यवहार याद आ गया । यह केवल '&' और '=' या कुछ इस तरह हास्यास्पद है।
माइक वेलर

2
RFC1738 के अनुसार आपको अतिरिक्त पात्रों को भी एनकोड करना होगा। इसलिए हालांकि यह ओपी के सवाल का जवाब देता है, लेकिन सामान्य प्रयोजन URL एनकोडर के रूप में इसकी उपयोगिता सीमित है। उदाहरण के लिए, यह गैर-अल्फ़ान्यूमेरिक्स जैसे जर्मन umlaut को संभालता नहीं है।
एलेक्स Nauda

3
यह काम नहीं करता है (IOS 7 भाग के लिए)। यह 26% में परिवर्तित नहीं होता है।
coolcool1994

1
चरित्र सेट आप के साथ की जरूरत है, के NSStringसाथ characterSetWithCharactersInStringउलटा ले लो invertedSetऔर उस के साथ प्रयोग करें stringByAddingPercentEncodingWithAllowedCharacters। एक उदाहरण के लिए यह एसओ उत्तर देखें ।
ज़ाफ

22

इसे URL एन्कोडिंग कहा जाता है । अधिक यहाँ

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

3
यह बहुत अधिक उपयोगी होगा यदि आपके द्वारा पोस्ट किए गए लिंक से कुछ सामग्री उत्तर में शामिल की गई थी।
chown

1
CFURLCreateStringByAddingPercentEscapes()पदावनत किया गया है। [NSString stringByAddingPercentEncodingWithAllowedCharacters:]इसके बजाय उपयोग करें ।
पंग

7

यह मेरा समाधान नहीं है। किसी और ने स्टैक्वेटफ्लो में लिखा है लेकिन मैं भूल गया हूं कि कैसे।

किसी तरह यह समाधान "अच्छी तरह से" काम करता है। यह diacritic, चीनी अक्षर और बहुत अधिक कुछ भी संभालता है।

- (NSString *) URLEncodedString {
    NSMutableString * output = [NSMutableString string];
    const char * source = [self UTF8String];
    int sourceLen = strlen(source);
    for (int i = 0; i < sourceLen; ++i) {
        const unsigned char thisChar = (const unsigned char)source[i];
        if (false && thisChar == ' '){
            [output appendString:@"+"];
        } else if (thisChar == '.' || thisChar == '-' || thisChar == '_' || thisChar == '~' ||
                   (thisChar >= 'a' && thisChar <= 'z') ||
                   (thisChar >= 'A' && thisChar <= 'Z') ||
                   (thisChar >= '0' && thisChar <= '9')) {
            [output appendFormat:@"%c", thisChar];
        } else {
            [output appendFormat:@"%%%02X", thisChar];
        }
    }
    return output;
}

अगर कोई मुझे बताएगा कि यह कोड किसने लिखा है, तो मैं वास्तव में इसकी सराहना करूंगा। मूल रूप से उसके पास कुछ स्पष्टीकरण है कि यह एन्कोडेड स्ट्रिंग ठीक उसी तरह से डिकोड करेगा जैसा वह चाहता है।

मैंने उसके हल को थोड़ा संशोधित किया। मुझे + के बजाय% 20 के साथ प्रतिनिधित्व करने के लिए स्थान पसंद है। बस इतना ही।



[आत्म UTF8String] क्या है?
युचाओ झोउ

1
@yuchaozh यह एक ऐसा फंक्शन है जिसे आप NSString की श्रेणी में रखते हैं। तो, स्व NSStirng है और [आत्म UTF8String] रिटर्न, निश्चित रूप से, UTF8 प्रारूप में इसकी स्ट्रिंग है।
केल्सी

4
 NSString * encodedString = (NSString *)CFURLCreateStringByAddingPercentEscapes(NUL,(CFStringRef)@"parameter",NULL,(CFStringRef)@"!*'();@&+$,/?%#[]~=_-.:",kCFStringEncodingUTF8 );

NSURL * url = [[NSURL alloc] initWithString:[@"address here" stringByAppendingFormat:@"?cid=%@",encodedString, nil]];

1
रिलीज़ एन्कोडेडस्ट्रिंग और url। यह कोड एनकोड पैरामीटर के बारे में है। पूरे पते को एनकोड करने के लिए "पैरामीटर" के बजाय स्ट्रिंग पास करें।
ज़ही

इसने मेरे लिए काम किया ... यहां तक ​​कि उस चरित्र को भी एन्कोड किया, जिसके साथ मुझे समस्या हो रही थी।
Виктор Иванов

3

यह ऑब्जेक्टिव C ARC.Use CFBridgingRelease में एक Object-C ऑब्जेक्ट के रूप में एक कोर फाउंडेशन-स्टाइल ऑब्जेक्ट बनाने और ARC .See फंक्शन CFBridgingRelease में ऑब्जेक्ट के स्वामित्व को स्थानांतरित करने के लिए काम कर सकता है।

+ (NSString *)encodeUrlString:(NSString *)string {
return CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes
                         (kCFAllocatorDefault,
                          (__bridge CFStringRef)string,
                          NULL,
                          CFSTR("!*'();:@&=+$,/?%#[]"),
                          kCFStringEncodingUTF8)
                         );}

2

स्विफ्ट iOS:

बस जानकारी के लिए: मैंने इसका उपयोग किया है:

extension String {

    func urlEncode() -> CFString {
        return CFURLCreateStringByAddingPercentEscapes(
            nil,
            self,
            nil,
            "!*'();:@&=+$,/?%#[]",
            CFStringBuiltInEncodings.UTF8.rawValue
        )
    }

}// end extension String

1
NSString *str = (NSString *)CFURLCreateStringByAddingPercentEscapes(
                             NULL,
                             (CFStringRef)yourString, 
                             NULL, 
                             CFSTR("/:"), 
                             kCFStringEncodingUTF8);

आपको स्वयं को रिलीज़ या ऑटोरेलिज़ करने की आवश्यकता होगी str


1

यहाँ मैं क्या उपयोग है। ध्यान दें कि आपको @autoreleasepoolसुविधा का उपयोग करना होगा या प्रोग्राम क्रैश हो सकता है या आईडीई को लॉक कर सकता है। मुझे अपनी आईडीई को तीन बार फिर से चालू करना पड़ा जब तक कि मुझे ठीक नहीं हुआ। ऐसा प्रतीत होता है कि यह कोड ARC के अनुरूप है।

यह प्रश्न कई बार पूछा गया है, और कई उत्तर दिए गए हैं, लेकिन दुख की बात है कि चुने गए (और कुछ अन्य लोगों द्वारा चुने गए) सभी गलत हैं।

यहाँ परीक्षण स्ट्रिंग है जिसका मैंने उपयोग किया है: This is my 123+ test & test2. Got it?!

ये मेरे उद्देश्य C ++ वर्ग विधियाँ हैं:

static NSString * urlDecode(NSString *stringToDecode) {
    NSString *result = [stringToDecode stringByReplacingOccurrencesOfString:@"+" withString:@" "];
    result = [result stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    return result;
}

static NSString * urlEncode(NSString *stringToEncode) {
    @autoreleasepool {
        NSString *result = (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(
                NULL,
                (CFStringRef)stringToEncode,
                NULL,
                (CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ",
                kCFStringEncodingUTF8
            ));
        result = [result stringByReplacingOccurrencesOfString:@"%20" withString:@"+"];
        return result;
    }
}

0

Google मैक के लिए अपने Google टूलबॉक्स में इसे लागू करता है । तो यह चोटी के लिए एक अच्छी जगह है कि वे इसे कैसे कर रहे हैं। एक अन्य विकल्प टूलबॉक्स को शामिल करना और उनके कार्यान्वयन का उपयोग करना है।

कार्यान्वयन को चेकआउट करें । (जो लोगों को यहां पोस्ट करने के लिए बिल्कुल नीचे आता है)।


0

यह मैं इस तरह से स्विफ्ट में कर रहा हूं।

extension String {
    func encodeURIComponent() -> String {
        return self.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())!
    }

    func decodeURIComponent() -> String {
        return self.componentsSeparatedByString("+").joinWithSeparator(" ").stringByRemovingPercentEncoding!
    }
}

-1

// इस तरह NSString इंस्टेंस विधि का उपयोग करें:

+ (NSString *)encodeURIComponent:(NSString *)string
{
NSString *s = [string stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
return s;
}

+ (NSString *)decodeURIComponent:(NSString *)string
{
NSString *s = [string stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
return s;
}

याद रखें, आपको केवल अपने पैरामीटर मान के लिए एनकोड या डीकोड करना चाहिए, न कि आपके द्वारा अनुरोधित सभी यूआरएल।


2
stringByReplacingPercentEscapeusingencoding: केवल और और = :-( निकल जाता है
सेबेस्तियन Stormacq

1
सही है, इसलिए + जैसी चीजें एन्कोडेड नहीं हैं, जब उन्हें होना चाहिए। तो उपरोक्त उत्तर का उपयोग न करें
जॉन बैलिंगर

-8
int strLength = 0;
NSString *urlStr = @"http://www";
NSLog(@" urlStr : %@", urlStr );
NSMutableString *mutableUrlStr = [urlStr mutableCopy];
NSLog(@" mutableUrlStr : %@", mutableUrlStr );
strLength = [mutableUrlStr length];
[mutableUrlStr replaceOccurrencesOfString:@":" withString:@"%3A" options:NSCaseInsensitiveSearch range:NSMakeRange(0, strLength)];
NSLog(@" mutableUrlStr : %@", mutableUrlStr );
strLength = [mutableUrlStr length];
[mutableUrlStr replaceOccurrencesOfString:@"/" withString:@"%2F" options:NSCaseInsensitiveSearch range:NSMakeRange(0, strLength)];
NSLog(@" mutableUrlStr : %@", mutableUrlStr );
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.