Ios 为什么URL片段前面的#char由stringbyaddingpercentescapesusingencode编码?

Ios 为什么URL片段前面的#char由stringbyaddingpercentescapesusingencode编码?,ios,url-encoding,Ios,Url Encoding,#用于在URL中指定片段时不是合法字符吗 那为什么[@”http://google.com#abc“stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]返回@”http://google.com%23abc“而不是@”http://google.com#abc"?使用incode方法添加百分比转义的stringbyaddingpercentescapesusingencode方法无法轻松确定字符串中的#是否是片段将跟随的有

#用于在URL中指定片段时不是合法字符吗


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

使用incode方法添加百分比转义的
stringbyaddingpercentescapesusingencode方法无法轻松确定字符串中的
#
是否是片段将跟随的有效指示,或者它是否是某个查询的一部分,例如,它应该百分比转义它:

http://google.com?q=#1
因此,在您的示例中,您不希望它被转义,但在上面的示例中(您希望为名为
q
的参数指定值
#1
),您会这样做

不过,我必须同意,奇怪的是,它们能逃脱
,但却不能逃脱
&
+

< >为了更好地控制哪些字符是漏掉的,哪些不是,您可能需要考虑<代码> StutyBudAdEngEngOndIn字符< <代码>或<代码> CFURLCreateStringByAddingPercentEscapes < /代码> ./P> 例如,如果要应用标准的百分比转义逻辑,但保留
#
字符未转义,则可以执行以下操作:

NSString *escaped = CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
                                                                              (CFStringRef)string,
                                                                              CFSTR("#"),
                                                                              NULL,
                                                                              kCFStringEncodingUTF8));
这显然假设
#
永远不会出现在片段之前的查询中


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

我只使用
stringByAddingPercentEscapesUsingEncoding:
对用于构建URL的URL参数值进行转义,不是整个网址,谢谢。你提到的那些我都知道。我只是想确认API被破坏了,而不是我对URL的理解,因为它们将合法使用的字符视为非法。即使是您的示例
cfurlCreateStringByAddingPercentescape
也没有多大意义,因为
charactersToLeaveUnescaped
是“您希望保留完整转义序列百分比的字符。传递NULL以指定转义所有非法字符。”在这里合法使用时,不必将其包含在
字符中以离开未转义的
。为了
cfurlCreateStringByAddingPercentEscape
(以及
StringByAddingPercentEscapeSusingEncode
)的目的,
#
是一个将被转义的字符。因此,如果不希望对其进行转义,则必须将其包含在
字符stoleaveunescaped
中,简单明了。我不会为苹果的角色选择辩护,因为他们认为“合法”,即他们逃跑的人,而不是他们的人;他们的实现纯粹是愚蠢的,不符合RFC3986,正如他们所声称的那样)。我想,这大大降低了
stringByAddingPercentEscapesUsingEncoding
的价值。我怀疑,当您看到新的(从iOS 7开始)方法
stringByAddingPercentEncodingWithAllowedCharacters
时,您会意识到这种混乱的实现。这就解决了一个棘手的问题,让开发人员全权选择哪些字符可以转义,哪些字符不可以转义。我明白了。这种API是可用的,但不是很有用。我希望 至少更好地记录它们。目前,
stringByAddingPercentEncodingWithAllowedCharacters
已经有很好的文档记录。但是,如果一个人阅读了
stringbyaddingpercentescapesusingencode
的文档,然后跟随它到
CFURLCreateStringByAddingPercentEscapes
并在讨论中阅读示例,如果假定使用
cfurlCreateStringByReplacingPercenteScapesusingEncode
后跟
cfurlCreateStringByAddingPercenteScapess
将给出一个完美的百分比编码URL字符串,这将是一种误导“更普遍的解决方案将对URL的各个组件应用不同的百分比转义逻辑”,我想指出,
NSURLComponents
似乎也是一个完美的解决方案,直到人们意识到自己甚至无法创建
NSURLComponents
(与
NSURL
相同)没有先对URL字符串进行必要的百分比编码。因此URL组件需要进行完美的URL编码,但是如果没有先对字符串进行URL编码,
NSURLComponents
则不可用…鸡和蛋。