stringByAddingPercentEscapesUsingEncoding不会转义“&”

时间:2014-01-17 20:36:54

标签: objective-c nsstring

我使用stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding将数据传递给php脚本。问题是如果该字段有char'&'在文中可以说:'某人&汽车',只有文字“某人”被保存,一切都在'&'之后没有。

要创建我使用[NSString stringWithFormat:]的字符串,所以我在表单中有5个字段,如果我使用stringbyReplacingOcorrencesOfstring:@"&",它的作用是将整个字符串替换为char'&'从文本字段,所以我得到错误。

有什么想法吗?

2 个答案:

答案 0 :(得分:6)

不幸的是,stringByAddingPercentEscapesUsingEncoding:实际上并没有逃避所有必要的URL字符。

相反,您可以使用较低级别的CoreFoundation函数:

(NSString *)CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)myString, NULL, (CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ", CFStringConvertNSStringEncodingToEncoding(encoding));

或使用ARC时:

CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(NULL, (__bridge CFStringRef)myString, NULL, (__bridge CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ", CFStringConvertNSStringEncodingToEncoding(encoding)));

有关NSString上使用此功能的类别示例,请参阅this post

答案 1 :(得分:2)

如果您想要专门允许自己编码的内容,请使用stringByAddingPercentEncodingWithAllowedCharacters进行以下工作。我在base64之后使用,所以这很好。

NSString *charactersToEscape = @"!*'();:@&=+$,/?%#[]\" ";
NSCharacterSet *customEncodingSet = [[NSCharacterSet characterSetWithCharactersInString:charactersToEscape] invertedSet];

NSString *url = [NSString stringWithFormat:@"%@", @"http://www.test.com/more/test.html?name=john&age=28"];
NSString *encodedUrl = [url stringByAddingPercentEncodingWithAllowedCharacters:customEncodingSet];