为什么在StringByAddingPercentEscapesUsingEncoding编码的URL片段之前#char?

时间:2014-09-25 17:10:17

标签: ios url-encoding

当用于在URL中指定片段时,它是否是一个合法字符?

那么为什么[@"http://google.com#abc" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]会返回@"http://google.com%23abc"而不是@"http://google.com#abc"

1 个答案:

答案 0 :(得分:1)

stringByAddingPercentEscapesUsingEncoding方法无法轻易确定字符串中的#是片段将遵循的有效指示,或者是否是例如某些查询的一部分,其应该是百分比逃避它:

http://google.com?q=#1

因此,在您的示例中,您不希望它被转义百分比,但在上面的示例中(您希望为名为#1的参数指定值q)。 / p>

我必须同意,他们很奇怪他们的百分比是#而不是&+

为了更好地控制哪些字符被转义,哪些不是,您可能需要考虑stringByAddingPercentEncodingWithAllowedCharactersCFURLCreateStringByAddingPercentEscapes

例如,如果您想应用标准百分比转义逻辑,但保留#字符未转义,则可以执行以下操作:

NSString *escaped = CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
                                                                              (CFStringRef)string,
                                                                              CFSTR("#"),
                                                                              NULL,
                                                                              kCFStringEncodingUTF8));

这显然假设#永远不会出现在片段之前的查询中。

更通用的解决方案会将不同的百分比转义逻辑应用于URL的各个组件(在各个组件中不允许组件之间的分隔符。)