Objective-C和Swift URL编码

我有这样的NSString

 http://www. 

但我想将其转换为:

 http%3A%2F%2Fwww. 

我怎样才能做到这一点?

为了逃避你想要的angular色是多一点工作。

示例代码

iOS7及以上版本:

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

NSLog输出:

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

以下是有用的URL编码字符集:

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

创build一个综合以上所有特征的字符集:

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

创build一个Base64

在Base64字符集的情况下:

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

对于Swift 3.0:

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

对于Swift 2.x:

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

注意: stringByAddingPercentEncodingWithAllowedCharacters也将编码需要编码的UTF-8字符。

Pre iOS7使用Core Foundation
使用ARC核心基础:

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

使用没有ARC的核心基础:

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

注意: -stringByAddingPercentEscapesUsingEncoding不会产生正确的编码,在这种情况下,它不会编码返回相同string的任何东西。

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 \”% – 。<> \ ^ _`{|}〜“

这就是所谓的url编码 。 更多在这里 。

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

这不是我的解决scheme。 其他人写在计算器,但我已经忘记了如何。

不知何故,这个解决scheme“很好”。 它处理变音符号,中文字符,以及其他任何东西。

 - (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; } 

如果有人会告诉我这个代码是谁写的,我会非常感激。 基本上他有一些解释,为什么这个编码的string将完全按照自己的意愿解码。

我稍微修改了他的解决scheme。 我喜欢用%20而不是+表示空间。 就这样。

  NSString * encodedString = (NSString *)CFURLCreateStringByAddingPercentEscapes(NUL,(CFStringRef)@"parameter",NULL,(CFStringRef)@"!*'();@&+$,/?%#[]~=_-.:",kCFStringEncodingUTF8 ); NSURL * url = [[NSURL alloc] initWithString:[@"address here" stringByAppendingFormat:@"?cid=%@",encodedString, nil]]; 

Swift iOS:

仅供参考:我用过这个:

 extension String { func urlEncode() -> CFString { return CFURLCreateStringByAddingPercentEscapes( nil, self, nil, "!*'();:@&=+$,/?%#[]", CFStringBuiltInEncodings.UTF8.rawValue ) } }// end extension String 
 NSString *str = (NSString *)CFURLCreateStringByAddingPercentEscapes( NULL, (CFStringRef)yourString, NULL, CFSTR("/:"), kCFStringEncodingUTF8); 

你将需要释放或自动释放你自己。

这可以在Objective C ARC中工作。使用CFBridgingRelease将Core Foundation样式的对象作为Objective-C对象进行投射,并将该对象的所有权转让给ARC。请参阅Function CFBridgingRelease here。

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

Google在他们的Google Toolbox for Mac中实现了这一点。 所以这是一个很好的地方,他们如何做到这一点。 另一个select是包含工具箱并使用它们的实现。

在这里检查实施。 (这到底是什么人在这里张贴)。

这是我如何迅速做到这一点。

 extension String { func encodeURIComponent() -> String { return self.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())! } func decodeURIComponent() -> String { return self.componentsSeparatedByString("+").joinWithSeparator(" ").stringByRemovingPercentEncoding! } } 

这是我使用的。 请注意,您必须使用@autoreleasepoolfunction,否则程序可能会崩溃或lockingIDE。 我不得不重新启动我的IDE三次,直到我意识到修复。 看来这个代码是ARC兼容的。

这个问题已经被多次提出,并给出了很多答案,但遗憾的是,所有被选中的人(以及其他人提出的)都是错误的。

这是我使用的testingstring: This is my 123+ test & test2. Got it?! This is my 123+ test & test2. Got it?!

这些是我的Objective 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; } } 

//使用这样的NSString实例方法:

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