如何在URL查询中转义&符号?

时间:2015-12-05 06:42:11

标签: ios swift

我到处寻找,并且在iOS中找不到一个明确的答案。我试图在我的网址查询中逃避&符号,但是

stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())

没有帮助。

作为一种肮脏的解决方法,我一直在使用

stringByReplacingOccurrencesOfString("&", withString: "and", options: NSStringCompareOptions.LiteralSearch, range: nil)

虽然这不是最安全的赌注。什么是正确的方式。

3 个答案:

答案 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中删除更多字符。

理想的方式是https://stackoverflow.com/a/26539134/2987764

答案 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