উত্তর:
আপনি যে চরিত্রগুলি চান তা থেকে বাঁচতে আরও কিছু কাজ করা উচিত।
উদাহরণ কোড
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 \"% -। <> \ ^ _ `{|} ~"
-stringByAddingPercentEscapesUsingEncoding
পদ্ধতিটি ব্যবহার করতে পারেন ।
stringByAddingPercentEscapesUsingEncoding
আচরণটি মনে করি । এটি কেবল '&' এবং '=' বা এর মতো হাস্যকর কিছু এনকোড করে।
NSString
সাথে একটি অক্ষর সেট তৈরি করুন, এর সাথে characterSetWithCharactersInString
বিপরীতমুখীটি নিন এবং এটির সাথে invertedSet
ব্যবহার করুন stringByAddingPercentEncodingWithAllowedCharacters
। উদাহরণস্বরূপ এই এসও উত্তরটি দেখুন ।
একে ইউআরএল এনকোডিং বলা হয় । আরও এখানে ।
-(NSString *)urlEncodeUsingEncoding:(NSStringEncoding)encoding {
return (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,
(CFStringRef)self,
NULL,
(CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ",
CFStringConvertNSStringEncodingToEncoding(encoding));
}
CFURLCreateStringByAddingPercentEscapes()
অবচয় করা হয়। [NSString stringByAddingPercentEncodingWithAllowedCharacters:]
পরিবর্তে ব্যবহার করুন।
এটি আমার সমাধান নয়। অন্য কেউ স্ট্যাকওভারফ্লোতে লিখেছেন তবে আমি কীভাবে ভুলে গেছি।
কোনওভাবে এই সমাধানটি "ভাল" কাজ করে। এটি ডায়াক্রিটিক, চাইনিজ চরিত্র এবং আরও অনেক কিছু পরিচালনা করে।
- (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 দিয়ে উপস্থাপন করতে চাই। এখানেই শেষ.
NSString * encodedString = (NSString *)CFURLCreateStringByAddingPercentEscapes(NUL,(CFStringRef)@"parameter",NULL,(CFStringRef)@"!*'();@&+$,/?%#[]~=_-.:",kCFStringEncodingUTF8 );
NSURL * url = [[NSURL alloc] initWithString:[@"address here" stringByAppendingFormat:@"?cid=%@",encodedString, nil]];
এটি অবজেক্টিভ সি এআরসি-তে কাজ করতে পারে C সিএফব্রিডিজিং ব্যবহার করুন একটি কোর ফাউন্ডেশন-স্টাইলের অবজেক্টটিকে একটি উদ্দেশ্য-সি অবজেক্ট হিসাবে কাস্ট করতে এবং বস্তুর মালিকানাটি এআরসি-তে স্থানান্তর করতে দয়া করে এখানে দেখুন ফাংশন সিএফবিড্রিজিং এখানে দয়া করে দয়া করে দেখুন।
+ (NSString *)encodeUrlString:(NSString *)string {
return CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes
(kCFAllocatorDefault,
(__bridge CFStringRef)string,
NULL,
CFSTR("!*'();:@&=+$,/?%#[]"),
kCFStringEncodingUTF8)
);}
সুইফট আইওএস:
কেবল তথ্যের জন্য: আমি এটি ব্যবহার করেছি:
extension String {
func urlEncode() -> CFString {
return CFURLCreateStringByAddingPercentEscapes(
nil,
self,
nil,
"!*'();:@&=+$,/?%#[]",
CFStringBuiltInEncodings.UTF8.rawValue
)
}
}// end extension String
আমি যা ব্যবহার করি তা এখানে। নোট আপনি @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;
}
}
গুগল ম্যাকের জন্য তাদের গুগল টুলবক্সে এটি প্রয়োগ করে । সুতরাং তারা এটি কীভাবে করছে তা শিখার জন্য এটি একটি ভাল জায়গা। আরেকটি বিকল্প হ'ল টুলবক্স অন্তর্ভুক্ত করা এবং তাদের প্রয়োগ ব্যবহার করা।
বাস্তবায়ন এখানে দেখুন । (যা এখানে লোকেরা পোস্ট করে যাচ্ছিল ঠিক সেটিতে নেমে আসে)।
এইভাবেই আমি দ্রুতগতিতে এটি করছি।
extension String {
func encodeURIComponent() -> String {
return self.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())!
}
func decodeURIComponent() -> String {
return self.componentsSeparatedByString("+").joinWithSeparator(" ").stringByRemovingPercentEncoding!
}
}
// এনএসএসআর্টিংয়ের পদ্ধতিটি এর মতো ব্যবহার করুন:
+ (NSString *)encodeURIComponent:(NSString *)string
{
NSString *s = [string stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
return s;
}
+ (NSString *)decodeURIComponent:(NSString *)string
{
NSString *s = [string stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
return s;
}
মনে রাখবেন, আপনার প্যারামিটার মানের জন্য আপনার কেবল এনকোড বা ডিকোড করা উচিত, আপনার অনুরোধ করা সমস্ত url নয়।
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 );
ùÕ9y^VêÏÊEØ®.ú/V÷ÅÖêú2Èh~
- নীচের সমাধানগুলির কোনওটিরই এটিকে সম্বোধন করার মতো মনে হচ্ছে না!