4

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

我已经测试了这段代码并打印(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];
}

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

编辑: 该问题已在 AFNetworking 中得到解决

4

2 回答 2

1

我不了解 API,但 URL 编码通常由

  • UTF-8 将字符串部分——路径、参数等——编码为字节
  • 应用字节值的百分比编码来获得纯 ASCII 字符串片段
  • 将 URL 片段与分隔符 :, /, ?, & 等组合在一起。
  • 再次将该字符串编码为字节
  • 通过网络发送

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

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

于 2012-01-25T16:30:05.820 回答
0

去掉stringByReplacingPercentEscapesUsingEncoding:encoding就好了,不需要编码两次,所以返回值应该是:

return [(NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, 
                    (CFStringRef)string, 
                    NULL, 
                    (CFStringRef)kAFLegalCharactersToBeEscaped, 
                    CFStringConvertNSStringEncodingToEncoding(encoding)) autorelease];
于 2012-03-16T09:01:03.233 回答