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! } }
这是我使用的。 请注意,您必须使用@autoreleasepool
function,否则程序可能会崩溃或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 );