我在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];
}
任何想法在这里出了什么问题?
答案 0 :(得分:1)
我不知道API,但URL编码通常由
完成有关细微差别,请参阅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];