当用于在URL中指定片段时,它是否是一个合法字符?
那么为什么[@"http://google.com#abc" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]
会返回@"http://google.com%23abc"
而不是@"http://google.com#abc"
?
答案 0 :(得分:1)
stringByAddingPercentEscapesUsingEncoding
方法无法轻易确定字符串中的#
是片段将遵循的有效指示,或者是否是例如某些查询的一部分,其应该是百分比逃避它:
http://google.com?q=#1
因此,在您的示例中,您不希望它被转义百分比,但在上面的示例中(您希望为名为#1
的参数指定值q
)。 / p>
我必须同意,他们很奇怪他们的百分比是#
而不是&
或+
。
为了更好地控制哪些字符被转义,哪些不是,您可能需要考虑stringByAddingPercentEncodingWithAllowedCharacters
或CFURLCreateStringByAddingPercentEscapes
。
例如,如果您想应用标准百分比转义逻辑,但保留#
字符未转义,则可以执行以下操作:
NSString *escaped = CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
(CFStringRef)string,
CFSTR("#"),
NULL,
kCFStringEncodingUTF8));
这显然假设#
永远不会出现在片段之前的查询中。
更通用的解决方案会将不同的百分比转义逻辑应用于URL的各个组件(在各个组件中不允许组件之间的分隔符。)