जवाबों:
अपने इच्छित पात्रों से बचने के लिए थोड़ा और काम करना होगा।
उदाहरण कोड
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())
नोट: stringByAddingPercentEncodingWithAllowedCharacters
UTF-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 \"% -। <> \ ^ _ `{|} ~ ~"
-stringByAddingPercentEscapesUsingEncoding
विधि का उपयोग कर सकते हैं ।
stringByAddingPercentEscapesUsingEncoding
व्यवहार याद आ गया । यह केवल '&' और '=' या कुछ इस तरह हास्यास्पद है।
इसे URL एन्कोडिंग कहा जाता है । अधिक यहाँ ।
-(NSString *)urlEncodeUsingEncoding:(NSStringEncoding)encoding {
return (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,
(CFStringRef)self,
NULL,
(CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ",
CFStringConvertNSStringEncodingToEncoding(encoding));
}
CFURLCreateStringByAddingPercentEscapes()
पदावनत किया गया है। [NSString stringByAddingPercentEncodingWithAllowedCharacters:]
इसके बजाय उपयोग करें ।
यह मेरा समाधान नहीं है। किसी और ने स्टैक्वेटफ्लो में लिखा है लेकिन मैं भूल गया हूं कि कैसे।
किसी तरह यह समाधान "अच्छी तरह से" काम करता है। यह 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 के साथ प्रतिनिधित्व करने के लिए स्थान पसंद है। बस इतना ही।
NSString * encodedString = (NSString *)CFURLCreateStringByAddingPercentEscapes(NUL,(CFStringRef)@"parameter",NULL,(CFStringRef)@"!*'();@&+$,/?%#[]~=_-.:",kCFStringEncodingUTF8 );
NSURL * url = [[NSURL alloc] initWithString:[@"address here" stringByAppendingFormat:@"?cid=%@",encodedString, nil]];
यह ऑब्जेक्टिव C ARC.Use CFBridgingRelease में एक Object-C ऑब्जेक्ट के रूप में एक कोर फाउंडेशन-स्टाइल ऑब्जेक्ट बनाने और ARC .See फंक्शन CFBridgingRelease में ऑब्जेक्ट के स्वामित्व को स्थानांतरित करने के लिए काम कर सकता है।
+ (NSString *)encodeUrlString:(NSString *)string {
return CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes
(kCFAllocatorDefault,
(__bridge CFStringRef)string,
NULL,
CFSTR("!*'();:@&=+$,/?%#[]"),
kCFStringEncodingUTF8)
);}
स्विफ्ट iOS:
बस जानकारी के लिए: मैंने इसका उपयोग किया है:
extension String {
func urlEncode() -> CFString {
return CFURLCreateStringByAddingPercentEscapes(
nil,
self,
nil,
"!*'();:@&=+$,/?%#[]",
CFStringBuiltInEncodings.UTF8.rawValue
)
}
}// end extension String
यहाँ मैं क्या उपयोग है। ध्यान दें कि आपको @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;
}
}
Google मैक के लिए अपने Google टूलबॉक्स में इसे लागू करता है । तो यह चोटी के लिए एक अच्छी जगह है कि वे इसे कैसे कर रहे हैं। एक अन्य विकल्प टूलबॉक्स को शामिल करना और उनके कार्यान्वयन का उपयोग करना है।
कार्यान्वयन को चेकआउट करें । (जो लोगों को यहां पोस्ट करने के लिए बिल्कुल नीचे आता है)।
यह मैं इस तरह से स्विफ्ट में कर रहा हूं।
extension String {
func encodeURIComponent() -> String {
return self.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())!
}
func decodeURIComponent() -> String {
return self.componentsSeparatedByString("+").joinWithSeparator(" ").stringByRemovingPercentEncoding!
}
}
// इस तरह NSString इंस्टेंस विधि का उपयोग करें:
+ (NSString *)encodeURIComponent:(NSString *)string
{
NSString *s = [string stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
return s;
}
+ (NSString *)decodeURIComponent:(NSString *)string
{
NSString *s = [string stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
return s;
}
याद रखें, आपको केवल अपने पैरामीटर मान के लिए एनकोड या डीकोड करना चाहिए, न कि आपके द्वारा अनुरोधित सभी यूआरएल।
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~
- नीचे दिए गए समाधानों में से कोई भी इसे संबोधित नहीं करता है!