AFNetworking:编码包含'%'的URL字符串 - 符号失败

时间:2012-01-25 15:52:50

标签: iphone ios networking encoding afnetworking

我在iOS应用中使用AFNetworking。我发现当请求参数包含百分号时会出现问题。然后编码失败。方法AFURLEncodedStringFromStringWithEncoding返回nil。

我已经测试了这段代码并打印了(null)

NSLog(@"%@", AFURLEncodedStringFromStringWithEncoding(@"%", NSUTF8StringEncoding));

预期输出应为:%25。其他字符可以编码没有问题。

该方法定义如下:

NSString * AFURLEncodedStringFromStringWithEncoding(NSString *string, NSStringEncoding encoding) {
    static NSString * const kAFLegalCharactersToBeEscaped = @"?!@#$^&%*+,:;='\"`<>()[]{}/\\|~ ";

    // Following the suggestion in documentation for `CFURLCreateStringByAddingPercentEscapes` to "pre-process" URL strings (using stringByReplacingPercentEscapesUsingEncoding) with unpredictable sequences that may already contain percent escapes.
    return [(NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)[string stringByReplacingPercentEscapesUsingEncoding:encoding], NULL, (CFStringRef)kAFLegalCharactersToBeEscaped, CFStringConvertNSStringEncodingToEncoding(encoding)) autorelease];
}

任何想法在这里出了什么问题?

编辑: The issue has been fixed in AFNetworking

2 个答案:

答案 0 :(得分:1)

我不知道API,但URL编码通常由

完成
  • UTF-8将字符串部分 - 路径,参数等 - 编码为字节
  • 应用字节值的百分比编码以获取仅ASCII字符串片段
  • 将URL片段与分隔符组合在一起:,/,?,&amp;等
  • 将该字符串再次编码为字节
  • 通过电汇发送

有关细微差别,请参阅http://tools.ietf.org/html/rfc3986#section-2.5。请注意,RFC指出,如果URL引用EBCDIC系统上的文档,则URL应指定其名称的EBCDIC编码的字节值,而不是EBCDIC系统的人类用户所知道的字符串名称。因此,URL最终是字节字符串而不是字符串。

至于如何让你的API正确表示字节串,我不确定。

答案 1 :(得分:0)

删除stringByReplacingPercentEscapesUsingEncoding:encoding很好,不需要编码两次,所以返回值应为:

return [(NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, 
                    (CFStringRef)string, 
                    NULL, 
                    (CFStringRef)kAFLegalCharactersToBeEscaped, 
                    CFStringConvertNSStringEncodingToEncoding(encoding)) autorelease];