Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/105.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS:URL字符串中的与号有问题_Ios_Objective C_Nsurl - Fatal编程技术网

iOS:URL字符串中的与号有问题

iOS:URL字符串中的与号有问题,ios,objective-c,nsurl,Ios,Objective C,Nsurl,如何在URL中传递字符串Mr.X和Mr.Y 我试过这个,但这一个除了符号外,其他字符都用 [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding] 在URL中,符号AND是受保护的关键字,表示包含querystring变量。不能将其作为值本身的一部分放入。你需要把它换成别的东西 这里有一个链接,指向StackOverflow上提出的相同问题:使用%26作为url转义 其他逃逸: $ %24 &

如何在URL中传递字符串Mr.X和Mr.Y

我试过这个,但这一个除了符号外,其他字符都用

[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]

在URL中,符号AND是受保护的关键字,表示包含querystring变量。不能将其作为值本身的一部分放入。你需要把它换成别的东西

这里有一个链接,指向StackOverflow上提出的相同问题:

使用%26作为url转义

其他逃逸:

$  %24
&  %26
+  %2B
,  %2C
/  %2F
:  %3A
;  %3B
=  %3D
?  %3F
@  %40

-stringByAddingPercentEscapesUsingEncoding:
不执行完整的转义编码。您应该使用
-replaceCurrencesofString:withString:

下面是一个完整的列表(镜像Gamecat的列表),正如最初在中建议的那样。正如尼克指出的,这是昂贵的,所以不要简单地列出完整的清单,而不考虑你逃跑的真正要求

NSMutableString *escaped = [actionString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];   
[escaped replaceOccurrencesOfString:@"$" withString:@"%24" options:NSCaseInsensitiveSearch range:wholeString];
[escaped replaceOccurrencesOfString:@"&" withString:@"%26" options:NSCaseInsensitiveSearch range:wholeString];
[escaped replaceOccurrencesOfString:@"+" withString:@"%2B" options:NSCaseInsensitiveSearch range:wholeString];
[escaped replaceOccurrencesOfString:@"," withString:@"%2C" options:NSCaseInsensitiveSearch range:wholeString];
[escaped replaceOccurrencesOfString:@"/" withString:@"%2F" options:NSCaseInsensitiveSearch range:wholeString];
[escaped replaceOccurrencesOfString:@":" withString:@"%3A" options:NSCaseInsensitiveSearch range:wholeString];
[escaped replaceOccurrencesOfString:@";" withString:@"%3B" options:NSCaseInsensitiveSearch range:wholeString];
[escaped replaceOccurrencesOfString:@"=" withString:@"%3D" options:NSCaseInsensitiveSearch range:wholeString];
[escaped replaceOccurrencesOfString:@"?" withString:@"%3F" options:NSCaseInsensitiveSearch range:wholeString];
[escaped replaceOccurrencesOfString:@"@" withString:@"%40" options:NSCaseInsensitiveSearch range:wholeString];
[escaped replaceOccurrencesOfString:@" " withString:@"%20" options:NSCaseInsensitiveSearch range:wholeString];
[escaped replaceOccurrencesOfString:@"\t" withString:@"%09" options:NSCaseInsensitiveSearch range:wholeString];
[escaped replaceOccurrencesOfString:@"#" withString:@"%23" options:NSCaseInsensitiveSearch range:wholeString];
[escaped replaceOccurrencesOfString:@"<" withString:@"%3C" options:NSCaseInsensitiveSearch range:wholeString];
[escaped replaceOccurrencesOfString:@">" withString:@"%3E" options:NSCaseInsensitiveSearch range:wholeString];
[escaped replaceOccurrencesOfString:@"\"" withString:@"%22" options:NSCaseInsensitiveSearch range:wholeString];
[escaped replaceOccurrencesOfString:@"\n" withString:@"%0A" options:NSCaseInsensitiveSearch range:wholeString];
NSMutableString*escaped=[actionString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
[转义替换发生率字符串:@“$”和字符串:@“%24”选项:NSCaseInsensitiveSearch范围:整字符串];
[转义替换发生率字符串:@“&”带字符串:@“%26”选项:NSCaseInsensitiveSearch范围:整字符串];
[转义替换发生率字符串:@“+”带字符串:@“%2B”选项:NSCaseInsensitiveSearch范围:整字符串];
[转义替换发生率字符串:@”,“带字符串:@“%2C”选项:NSCaseInsensitiveSearch范围:整字符串];
[转义替换发生率字符串:@”/“带字符串:@”%2F“选项:NSCaseInsensitiveSearch范围:整字符串];
[转义替换发生率字符串:@:“带字符串:@”%3A“选项:NSCaseInsensitiveSearch范围:整字符串];
[转义的替换发生率字符串:@;“带字符串:@”%3B“选项:NSCaseInsensitiveSearch范围:整字符串];
[转义替换发生率字符串:@“=”带字符串:@“%3D”选项:NSCaseInsensitiveSearch范围:整字符串];
[转义替换发生率字符串:@”?“带字符串:@“%3F”选项:NSCaseInsensitiveSearch范围:整字符串];
[转义替换发生率字符串:@“@”和字符串:@“%40”选项:NSCaseInsensitiveSearch范围:整字符串];
[已转义的替换发生率字符串:@”“带字符串:@“%20”选项:NSCaseInsensitiveSearch范围:整字符串];
[转义替换发生率字符串:@“\t”和字符串:@“%09”选项:NSCaseInsensitiveSearch范围:整字符串];
[转义替换发生率字符串:@“#”和字符串:@“%23”选项:NSCaseInsensitiveSearch范围:整字符串];
[转义的替换发生率字符串:@”“带字符串:@“%3E”选项:NSCaseInsensitiveSearch范围:整字符串];
[转义替换发生率字符串:@“\”,带字符串:@“%22”选项:NSCaseInsensitiveSearch范围:整字符串];
[转义替换发生率字符串:@“\n”和字符串:@“%0A”选项:NSCaseInsensitiveSearch范围:整字符串];
此代码肯定会对您的URL进行哈希处理。

甚至更短:

@implementation NSString (Escaping)
- (NSString*)stringWithPercentEscape {            
    return [(NSString *) CFURLCreateStringByAddingPercentEscapes(
        NULL, 
        (CFStringRef)[[self mutableCopy] autorelease], 
        NULL, 
        CFSTR("=,!$&'()*+;@?\n\"<>#\t :/"),
        kCFStringEncodingUTF8) autorelease];
}
@end
@实现NSString(转义)
-(NSString*)stringWithPercentEscape{
返回[(NSString*)cfurlCreateStringByAddingPercents转义(
无效的
(CFStringRef)[[self-mutableCopy]自动释放],
无效的
CFSTR(“=,!$&'()*+;@?\n\“#\t:/”,
kCFStringEncodingUTF8)自动释放];
}
@结束
这里它又是一个符合圆弧的内联函数助手:

#if __has_feature(objc_arc)
static inline NSString *hxURLEscape(NSString *v) {
    static CFStringRef _hxURLEscapeChars = CFSTR("=,!$&'()*+;@?\r\n\"<>#\t :/");
    return ((__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(
        NULL, 
        (__bridge CFStringRef)[v mutableCopy], 
        NULL, 
        _hxURLEscapeChars, 
        kCFStringEncodingUTF8));
}
#endif
#如果"具有"功能(objc"弧)
静态内联NSString*hxURLEscape(NSString*v){
静态CFStringRef_hxURLEscapeChars=CFSTR(“=,!$&'()*+;@?\r\n\“#\t:/”;
返回((uu桥u传输NSString*)cfurlCreateStringByAddingPercents转义(
无效的
(uu桥CFStringRef)[v可变副本],
无效的
_hxURLEscapeChars,
kCFStringEncodingUTF8);
}
#恩迪夫

stringbyaddingpercentescapesusingencode
也不能正常使用
+

下面是一个更简单的解决方案:

[[[urlString stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding] stringByReplacingOccurrencesOfString:@"&" withString:@"%26"] stringByReplacingOccurrencesOfString:@"+" withString:@"%2b"];

CFURLCreateStringByAddingPercentEscapes
已被弃用(自iOS9以来),因此,如何修改URLQueryAllowedCharacterSet以删除保留字符,从而使它们能够相对高效地进行百分比编码

- (NSString *)URLQueryValueEncodedString:(NSString *)string {
    static NSMutableCharacterSet *_allowedCharacterSet = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        NSString *reservedCharacters = @"=,!$&'()*+;@?\r\n\"<>#\t :/[]%";
        _allowedCharacterSet = [NSCharacterSet URLQueryAllowedCharacterSet].mutableCopy;
        [_allowedCharacterSet removeCharactersInString:reservedCharacters];
    });

    return [string stringByAddingPercentEncodingWithAllowedCharacters:_allowedCharacterSet];
}
-(NSString*)URLQueryValueEncodedString:(NSString*)字符串{
静态NSMutableCharacterSet*_allowedCharacterSet=nil;
静态调度一次;
一次发送(一次发送)^{
NSString*reservedCharacters=@“=,!$&'()*+;@?\r\n\“\t:/[]%”;
_allowedCharacterSet=[NSCharacterSet URLQueryAllowedCharacterSet].mutableCopy;
[\u allowedCharacterSet removeCharactersInString:reservedCharacters];
});
返回[string stringByAddingPercentEncodingWithAllowedCharacters:_allowedCharacterSet];
}

因此,如果我执行以下操作,我是对的[statusTextField.text StringByReplacingOccurrence sofString:@“&”with String:@“%26”],在我的服务器端,我将%26替换为&并存储在数据库中。请参阅下面罗杰的回答。虽然这个解决方案是一个很好的通用答案,但从iOS版本2.2开始,它并不是一个完整的URL编码实现。如果任何人有任何关于在以后的iOS版本中修复此问题的其他信息,请在这里发表评论。事实上,我认为我们甚至不需要复制它,可以用
self
替换
[[self-mutableCopy]autorelease]
。有关此问题的更多详细信息,请参阅
CFURLCreateStringByAddingPercentEscapes
关于此问题的好文章的文档。我相信正确的代码更像NSMutableString*Escape=[NSMutableString stringWithString:[actionString…];和NSMakeRange(0,[转义长度])而不是整串。这相当昂贵,CFURLCreateStringByAddingPercentEscapes()更好。CFURLCreateStringByAddingPercentEscapes是否与StringByAddingPercentEscapes使用Encoding存在相同的问题?