我有一个包含特殊字符的URL(非常使用%)..我想对URL进行编码,如何? 这是我的网址的一个示例:http://some.com//en/it/name-50%-other-set-50%-/68
我尝试了以下内容:
// Option - 1.
NSString* str = [self.shareURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
// Option - 2.
NSString *unsafeString = @"this &string= confuses ? the InTeRwEbZ";
CFStringRef safeString = CFURLCreateStringByAddingPercentEscapes (
NULL,
(CFStringRef)unsafeString,
NULL,
CFSTR("/%&=?$#+-~@<>|\\*,.()[]{}^!"),
kCFStringEncodingUTF8
);
// Option - 3.
NSString *escapedString = [unescaped stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet]];
答案 0 :(得分:0)
如您所说,http://some.com//en/it/name-50%-other-set-50%-/68是一个糟糕的网址。你应该有什么好的网址?
为什么//在.com之后?
答案 1 :(得分:0)
按顺序解决三个变化:
使用stringByAddingPercentEscapesUsingEncoding
非常方便,可以解决您的问题,其中包含%
的网址。
然而,这种方法非常有限,并没有解决许多常见的百分比逃逸问题。例如,如果您的好奇网址路径字符串中包含?
,该怎么办?这种方法可以让问号不被转义(因为问号在URL中作为分隔请求参数开始的一种方式是有效的),如果您确实需要?
作为一部分,这将是一个问题那条路。
在实践中,虽然人们喜欢建议stringByAddingPercentEscapesUsingEncoding
作为对逃避问题百分比的回应,但它总是无法提供足够的控制来充分完成工作。
这导致我们CFURLCreateStringByAddingPercentEscapes
,这是提供更高级别控制的核心基础功能。在iOS 7之前,这是“转到”解决方案,允许您限定您可能想要另外转义的“合法字符”(例如,在我之前的示例中为?
)。您还可以指定通常转义的字符,您可能希望不转义。
关于这个函数示例的三个观察结果:
您已指定要转义的大量字符,包括一些本来可以转义的字符。包含这些额外字符并没有什么坏处,但暗示对这个功能的作用有轻微的误解。
同样,您要转义一些不需要转义的字符(.
,-
和~
)。
最后,当我们在Objective-C代码中使用此功能时,我们通常会将其作为NSString
返回,并通过CFBridgingRelease
或__bridge_transfer
转让所有权。这使我们不必处理Core Foundation类型并且必须手动CFRelease
。
无论如何,这会产生类似的结果:
- (NSString *)percentEscapeString:(NSString *)string
{
return CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
(CFStringRef)string,
NULL,
(CFStringRef)@":/?@!$&'()*+,;=",
kCFStringEncodingUTF8));
}
顺便说一句,如果你执行这种百分比转义例程,请在URL的各个组件上执行(例如,只是名称中“50%”的路径部分),而不是整个URL。 URL中有一些有效的字符(例如/
或:
),但在此路径中无效,因此您希望百分比在路径中转义这些字符,但不是URL作为一个整体。
这会引导我们stringByAddingPercentEncodingWithAllowedCharacters
。在iOS 7中引入的这种方法提供了与上述Core Foundation功能相同的控制级别,但没有桥接的麻烦。只需选择合适的字符集,它就会从那里开始。