উদ্দেশ্য-সি এবং সুইফট ইউআরএল এনকোডিং


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);

এনএসলগ আউটপুট:

পলায়ন স্ট্রিং: http% 3A% 2F% 2Fwww

নিম্নলিখিতটি ইউআরএল এনকোডিং অক্ষর সেট দরকারী:

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

উপরের সমস্তটি সমন্বিত একটি অক্ষর তৈরি করা:

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

একটি বেস 64 তৈরি করা হচ্ছে

বেস 64 অক্ষরের ক্ষেত্রে:

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

সুইফট ৩.০ এর জন্য:

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

সুইফট ২.x এর জন্য:

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

দ্রষ্টব্য: stringByAddingPercentEncodingWithAllowedCharactersইউটিএফ -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 টি অক্ষর:

`#% ^ {} [] | \" <> প্লাস হিসাবে স্পেস অক্ষর ভাগ হয়ে গেছে percent

testString:

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

encodedString:

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

দ্রষ্টব্য: এই অক্ষরগুলির সেটটি আপনার প্রয়োজনগুলি পূরণ করে কিনা তা বিবেচনা করুন, যদি প্রয়োজন অনুযায়ী সেগুলি পরিবর্তন না করেন।

আরএফসি 3986 টি অক্ষর এনকোডিংয়ের প্রয়োজন (এটি এনকোডিং উপসর্গের অক্ষর হওয়ায়% যুক্ত হয়েছে):

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

কিছু "অনারक्षित অক্ষর" অতিরিক্তভাবে এনকোড করা হয়:

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


1
এছাড়াও খেয়াল করুন যে আপনি এনএসএসস্ট্রিংয়ের -stringByAddingPercentEscapesUsingEncodingপদ্ধতিটি ব্যবহার করতে পারেন ।
মাইক ওয়েলার

2
হ্যাঁ হ্যাঁ, এখন আমি মজার stringByAddingPercentEscapesUsingEncodingআচরণটি মনে করি । এটি কেবল '&' এবং '=' বা এর মতো হাস্যকর কিছু এনকোড করে।
মাইক ওয়েলার

2
আরএফসি 1738 অনুসারে আপনাকে অতিরিক্ত অক্ষরগুলিও এনকোড করতে হবে। সুতরাং এটি ওপি-র প্রশ্নের উত্তর দিলেও, এটি সাধারণ-উদ্দেশ্য ইউআরএল এনকোডার হিসাবে সীমিত উপযোগিতা রয়েছে। উদাহরণস্বরূপ, এটি কোনও জার্মান উমলাউটের মতো অ-অক্ষর সংখ্যাকে পরিচালনা করে না।
অ্যালেক্স নওদা

3
এটি কাজ করে না (আইওএস 7 অংশের জন্য)। এটি & 26% তে রূপান্তর করে না।
coolcool1994

1
আপনার NSStringসাথে একটি অক্ষর সেট তৈরি করুন, এর সাথে characterSetWithCharactersInStringবিপরীতমুখীটি নিন এবং এটির সাথে invertedSetব্যবহার করুন stringByAddingPercentEncodingWithAllowedCharacters। উদাহরণস্বরূপ এই এসও উত্তরটি দেখুন
জাফ

22

একে ইউআরএল এনকোডিং বলা হয় । আরও এখানে

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

3
আপনি পোস্ট করা লিঙ্কগুলি থেকে কিছু সামগ্রী উত্তরে অন্তর্ভুক্ত করা থাকলে এটি অনেক বেশি কার্যকর হবে।
chown

1
CFURLCreateStringByAddingPercentEscapes()অবচয় করা হয়। [NSString stringByAddingPercentEncodingWithAllowedCharacters:]পরিবর্তে ব্যবহার করুন।
পাং

7

এটি আমার সমাধান নয়। অন্য কেউ স্ট্যাকওভারফ্লোতে লিখেছেন তবে আমি কীভাবে ভুলে গেছি।

কোনওভাবে এই সমাধানটি "ভাল" কাজ করে। এটি ডায়াক্রিটিক, চাইনিজ চরিত্র এবং আরও অনেক কিছু পরিচালনা করে।

- (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 দিয়ে উপস্থাপন করতে চাই। এখানেই শেষ.



[স্ব UTF8 স্ট্রিং] কি?
ইউচাও ঝো

1
@ ইউচাযোজ এটি এমন একটি ফাংশন যা আপনি এনএসএসস্ট্রিংয়ের একটি বিভাগের মধ্যে রেখেছিলেন। সুতরাং, স্ব এনএসটিটিং এবং [স্ব ইউটিএফ 8 স্ট্রিং] প্রত্যাবর্তন করে, এটির স্ট্রিং ইউটিএফ 8 ফর্ম্যাটে রয়েছে।
কেলসি

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 সিএফব্রিডিজিং ব্যবহার করুন একটি কোর ফাউন্ডেশন-স্টাইলের অবজেক্টটিকে একটি উদ্দেশ্য-সি অবজেক্ট হিসাবে কাস্ট করতে এবং বস্তুর মালিকানাটি এআরসি-তে স্থানান্তর করতে দয়া করে এখানে দেখুন ফাংশন সিএফবিড্রিজিং এখানে দয়া করে দয়া করে দেখুন।

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

2

সুইফট আইওএস:

কেবল তথ্যের জন্য: আমি এটি ব্যবহার করেছি:

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বৈশিষ্ট্য ব্যবহার করতে হবে বা প্রোগ্রাম আইডিই ক্রাশ বা লকআপ হতে পারে। আমি ঠিক না হওয়া পর্যন্ত আমাকে তিনবার আমার আইডিই পুনরায় চালু করতে হয়েছিল। দেখা যাচ্ছে যে এই কোডটি এআরসি সম্মতিযুক্ত।

এই প্রশ্নটি অনেকবার জিজ্ঞাসা করা হয়েছে, এবং অনেক উত্তর দেওয়া হয়েছে, তবে দুঃখের বিষয় যা নির্বাচিত (এবং আরও কয়েকজন প্রস্তাবিত করেছেন) সমস্তই ভুল।

আমি যে পরীক্ষার স্ট্রিংটি ব্যবহার করেছি তা এখানে: This is my 123+ test & test2. Got it?!

এগুলি আমার উদ্দেশ্য সি ++ শ্রেণি পদ্ধতি:

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

গুগল ম্যাকের জন্য তাদের গুগল টুলবক্সে এটি প্রয়োগ করে । সুতরাং তারা এটি কীভাবে করছে তা শিখার জন্য এটি একটি ভাল জায়গা। আরেকটি বিকল্প হ'ল টুলবক্স অন্তর্ভুক্ত করা এবং তাদের প্রয়োগ ব্যবহার করা।

বাস্তবায়ন এখানে দেখুন । (যা এখানে লোকেরা পোস্ট করে যাচ্ছিল ঠিক সেটিতে নেমে আসে)।


0

এইভাবেই আমি দ্রুতগতিতে এটি করছি।

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

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

-1

// এনএসএসআর্টিংয়ের পদ্ধতিটি এর মতো ব্যবহার করুন:

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

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

মনে রাখবেন, আপনার প্যারামিটার মানের জন্য আপনার কেবল এনকোড বা ডিকোড করা উচিত, আপনার অনুরোধ করা সমস্ত url নয়।


2
স্ট্রিংবায়ারপ্লেসিং পার্সেন্ট এসার্চুসিনজেঙ্কিং: কেবল পলায়ন করে এবং এবং = :-(
সাবেস্টিয়ান স্টর্ম্যাক ২

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 );
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.