我到处寻找,并且在iOS中找不到一个明确的答案。我试图在我的网址查询中逃避&符号,但是
stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())
没有帮助。
作为一种肮脏的解决方法,我一直在使用
stringByReplacingOccurrencesOfString("&", withString: "and", options: NSStringCompareOptions.LiteralSearch, range: nil)
虽然这不是最安全的赌注。什么是正确的方式。
答案 0 :(得分:2)
您可以将其替换为%26。我不清楚为什么URLQueryAllowedCharacterSet()
没有抓住它。
答案 1 :(得分:2)
我想以下代码应该有用。
NSMutableString * lQueryString = [NSMutableString string];
NSMutableCharacterSet * lQueryAllowedCharacterSet = [[NSMutableCharacterSet alloc]init];
[lQueryAllowedCharacterSet formUnionWithCharacterSet:[NSCharacterSet URLQueryAllowedCharacterSet]];
[lQueryAllowedCharacterSet removeCharactersInString:@"&"];
[lQueryString appendString: [@"SampleQueryValue&" stringByAddingPercentEncodingWithAllowedCharacters: lQueryAllowedCharacterSet]];
NSLog(@"%@",lQueryString);
输出
SampleQueryValue%26
我不确定是否需要从QueryAllowedCharacterSet中删除更多字符。
答案 2 :(得分:0)
如果您不需要在10.10或iOS 8之前支持任何内容,则可以将NSURLQueryItem与NSURLComponents一起使用。
如果您需要支持旧版本的OS X或iOS,那么可以在URL Session Programming Guide中找到明确的答案:
CFStringRef encodedString = CFURLCreateStringByAddingPercentEscapes(
kCFAllocatorDefault,
originalString,
NULL,
CFSTR(":/?#[]@!$&'()*+,;="),
kCFStringEncodingUTF8);
根据需要使用适当的__bridge和__bridge_transfer强制转换。
您之前的方法存在的问题是旧的NSURL API的设计......好吧,不要把它放得太精确,错误。 API假定您希望一次编码整个查询字符串甚至整个URL,因此它们只留下&符号和其他类似的保留字符。当然,这通常不是您在实践中真正想要做的事情,但它是原始NSURL API的表现方式。
作为补充说明,如果您尝试将结果粘贴到例如HTML属性中,则需要执行上述操作,然后使用HTML实体编码方法对其进行第二次编码。有关第二步的帮助,请参阅Question 1105169。