Encoding NSString类别用于更好的百分比转义

Encoding NSString类别用于更好的百分比转义,encoding,nsstring,urlencode,percent-encoding,Encoding,Nsstring,Urlencode,Percent Encoding,我为我的一个项目编写了一个小的NSString类别,更好地实现了百分比转义: @即时通讯 实现NSString(转义) -(NSString*)StringByAddingSafePercentsEscapeSusingEncoding:(NSStringEncoding)编码 { NSRange-whistring=NSMakeRange(0,[自身长度]); NSMutableString*转义=[NSMutableString stringWithString:[self stringBy

我为我的一个项目编写了一个小的NSString类别,更好地实现了百分比转义: @即时通讯

实现NSString(转义)
-(NSString*)StringByAddingSafePercentsEscapeSusingEncoding:(NSStringEncoding)编码
{
NSRange-whistring=NSMakeRange(0,[自身长度]);
NSMutableString*转义=[NSMutableString stringWithString:[self stringByAddingPercentEscapesUsingEncoding:encoding];
[转义替换发生率字符串:@“$”和字符串:@“%24”选项:NSCaseInsensitiveSearch范围:整字符串];
[escaping replaceCurrencesofString:@“&”with字符串:@“%26”选项:NSCaseInsensitiveSearch范围:整字符串];
[转义替换发生率字符串:@“+”带字符串:@“%2B”选项:NSCaseInsensitiveSearch范围:整字符串];
[转义替换发生率字符串:@”,“带字符串:@“%2C”选项:NSCaseInsensitiveSearch范围:整字符串];
[escaping replaceCurrencesofString:@”/“with字符串:@”%2F“选项:NSCaseInsensitiveSearch范围:整字符串];
[escaping ReplaceCurrencesofString:@:“withString:@”%3A“选项:NSCaseInsensitiveSearch范围:整串];
[escaping ReplaceCurrencesofString:@];“withString:@”%3B“选项:NSCaseInsensitiveSearch范围:整串];
[escaping ReplaceCurrencesofString:@“-”带字符串:@“%2D”选项:NSCaseInsensitiveSearch范围:整字符串];
[转义替换发生率字符串:@“=”带字符串:@“%3D”选项:NSCaseInsensitiveSearch范围:整字符串];
[escaping ReplaceCurrencesofString:@”?“带字符串:@”%3F“选项:NSCaseInsensitiveSearch范围:整字符串];
[转义替换发生率字符串:@“@”和字符串:@“%40”选项:NSCaseInsensitiveSearch范围:整字符串];
[escaping ReplaceCurrenceSofString:@”和字符串:@“%20”选项:NSCaseInsensitiveSearch范围:整字符串];
[转义替换发生率字符串:@“\t”和字符串:@“%09”选项:NSCaseInsensitiveSearch范围:整字符串];
[转义替换发生率字符串:@“#”和字符串:@“%23”选项:NSCaseInsensitiveSearch范围:整字符串];
[escaping ReplaceCurrenceSofString:@”“带字符串:@“%3E”选项:NSCaseInsensitiveSearch范围:整字符串];
[带字符串的转义替换发生字符串:@“\”@“%22”选项:NSCaseInsensitiveSearch范围:整字符串];
[转义替换发生率字符串:@“\n”和字符串:@“%0A”选项:NSCaseInsensitiveSearch范围:整字符串];
NSString*escaped=[NSString stringWithString:escaping];
返回逃逸;
}
@结束
在这一个项目中,它工作得很好,我喜欢使用它。但是当我将它移植到另一个项目中时,该代码通过EXC\u BAD\u访问。我能在该代码中做些更好的东西吗?

我认为应该是:

NSRange wholeString = NSMakeRange(0, [self length]-1);
如果replaceCurrenceSofString:withString:options:range:method迭代超过字符串中的最后一个字符,您将获得“错误访问”

或者,您可以使用类似的替换方法,该方法已经在整个长度上进行了迭代。但是,我不确定默认搜索选项是什么:

escaping = [escaping stringByReplacingOccurencesOfString:@"$" withString:@"%24"];
我认为应该是:

NSRange wholeString = NSMakeRange(0, [self length]-1);
如果replaceCurrenceSofString:withString:options:range:method迭代超过字符串中的最后一个字符,您将获得“错误访问”

或者,您可以使用类似的替换方法,该方法已经在整个长度上进行了迭代。但是,我不确定默认搜索选项是什么:

escaping = [escaping stringByReplacingOccurencesOfString:@"$" withString:@"%24"];

我只是偶然发现了我的问题:

由于字符串在将一个字符替换为三个字符时会有效地更改其长度,因此每次替换时字符串长度都会更改。因此,正确的类别实现是:

@implementation NSString (Escaping)
- (NSString *)stringByAddingSafePercentEscapesUsingEncoding:(NSStringEncoding)encoding
{
    NSRange wholeString = NSMakeRange(0, [self length]);
    NSMutableString *escaping = [NSMutableString stringWithString:[self stringByAddingPercentEscapesUsingEncoding:encoding]];
    [escaping replaceOccurrencesOfString:@"$" withString:@"%24" options:NSCaseInsensitiveSearch range:wholeString];
    wholeString = NSMakeRange(0, [escaping length]);
    [escaping replaceOccurrencesOfString:@"&" withString:@"%26" options:NSCaseInsensitiveSearch range:wholeString];
    wholeString = NSMakeRange(0, [escaping length]);
    [escaping replaceOccurrencesOfString:@"+" withString:@"%2B" options:NSCaseInsensitiveSearch range:wholeString];
    wholeString = NSMakeRange(0, [escaping length]);
    [escaping replaceOccurrencesOfString:@"," withString:@"%2C" options:NSCaseInsensitiveSearch range:wholeString];
    wholeString = NSMakeRange(0, [escaping length]);
    [escaping replaceOccurrencesOfString:@"/" withString:@"%2F" options:NSCaseInsensitiveSearch range:wholeString];
    wholeString = NSMakeRange(0, [escaping length]);
    [escaping replaceOccurrencesOfString:@":" withString:@"%3A" options:NSCaseInsensitiveSearch range:wholeString];
    wholeString = NSMakeRange(0, [escaping length]);
    [escaping replaceOccurrencesOfString:@";" withString:@"%3B" options:NSCaseInsensitiveSearch range:wholeString];
    wholeString = NSMakeRange(0, [escaping length]);
    [escaping replaceOccurrencesOfString:@"-" withString:@"%2D" options:NSCaseInsensitiveSearch range:wholeString];
    wholeString = NSMakeRange(0, [escaping length]);
    [escaping replaceOccurrencesOfString:@"=" withString:@"%3D" options:NSCaseInsensitiveSearch range:wholeString];
    wholeString = NSMakeRange(0, [escaping length]);
    [escaping replaceOccurrencesOfString:@"?" withString:@"%3F" options:NSCaseInsensitiveSearch range:wholeString];
    wholeString = NSMakeRange(0, [escaping length]);
    [escaping replaceOccurrencesOfString:@"@" withString:@"%40" options:NSCaseInsensitiveSearch range:wholeString];
    wholeString = NSMakeRange(0, [escaping length]);
    [escaping replaceOccurrencesOfString:@" " withString:@"%20" options:NSCaseInsensitiveSearch range:wholeString];
    wholeString = NSMakeRange(0, [escaping length]);
    [escaping replaceOccurrencesOfString:@"\t" withString:@"%09" options:NSCaseInsensitiveSearch range:wholeString];
    wholeString = NSMakeRange(0, [escaping length]);
    [escaping replaceOccurrencesOfString:@"#" withString:@"%23" options:NSCaseInsensitiveSearch range:wholeString];
    wholeString = NSMakeRange(0, [escaping length]);
    [escaping replaceOccurrencesOfString:@"<" withString:@"%3C" options:NSCaseInsensitiveSearch range:wholeString];
    wholeString = NSMakeRange(0, [escaping length]);
    [escaping replaceOccurrencesOfString:@">" withString:@"%3E" options:NSCaseInsensitiveSearch range:wholeString];
    wholeString = NSMakeRange(0, [escaping length]);
    [escaping replaceOccurrencesOfString:@"\"" withString:@"%22" options:NSCaseInsensitiveSearch range:wholeString];
    wholeString = NSMakeRange(0, [escaping length]);
    [escaping replaceOccurrencesOfString:@"\n" withString:@"%0A" options:NSCaseInsensitiveSearch range:wholeString];
    NSString *escaped = [NSString stringWithString:escaping];

    return escaped;
}
@end
@实现NSString(转义)
-(NSString*)StringByAddingSafePercentsEscapeSusingEncoding:(NSStringEncoding)编码
{
NSRange-whistring=NSMakeRange(0,[自身长度]);
NSMutableString*转义=[NSMutableString stringWithString:[self stringByAddingPercentEscapesUsingEncoding:encoding];
[转义替换发生率字符串:@“$”和字符串:@“%24”选项:NSCaseInsensitiveSearch范围:整字符串];
批发性字符串=NSMakeRange(0,[转义长度]);
[escaping replaceCurrencesofString:@“&”with字符串:@“%26”选项:NSCaseInsensitiveSearch范围:整字符串];
批发性字符串=NSMakeRange(0,[转义长度]);
[转义替换发生率字符串:@“+”带字符串:@“%2B”选项:NSCaseInsensitiveSearch范围:整字符串];
批发性字符串=NSMakeRange(0,[转义长度]);
[转义替换发生率字符串:@”,“带字符串:@“%2C”选项:NSCaseInsensitiveSearch范围:整字符串];
批发性字符串=NSMakeRange(0,[转义长度]);
[escaping replaceCurrencesofString:@”/“with字符串:@”%2F“选项:NSCaseInsensitiveSearch范围:整字符串];
批发性字符串=NSMakeRange(0,[转义长度]);
[escaping ReplaceCurrencesofString:@:“withString:@”%3A“选项:NSCaseInsensitiveSearch范围:整串];
批发性字符串=NSMakeRange(0,[转义长度]);
[escaping ReplaceCurrencesofString:@];“withString:@”%3B“选项:NSCaseInsensitiveSearch范围:整串];
批发性字符串=NSMakeRange(0,[转义长度]);
[escaping ReplaceCurrencesofString:@“-”带字符串:@“%2D”选项:NSCaseInsensitiveSearch范围:整字符串];
批发性字符串=NSMakeRange(0,[转义长度]);
[转义替换发生率字符串:@“=”带字符串:@“%3D”选项:NSCaseInsensitiveSearch范围:整字符串];
批发性字符串=NSMakeRange(0,[转义长度]);
[escaping ReplaceCurrencesofString:@”?“带字符串:@”%3F“选项:NSCaseInsensitiveSearch范围:整字符串];
批发性字符串=NSMakeRange(0,[转义长度]);
[转义替换发生率字符串:@“@”和字符串:@“%40”选项:NSCaseInsensitiveSearch范围:整字符串];
批发性字符串=NSMakeRange(0,[转义长度]);
[escaping ReplaceCurrenceSofString:@”和字符串:@“%20”选项:NSCaseInsensitiveSearch范围:批发