0

例如,我试图将这些字符传递给服务器*()$

我以这种方式对 NSUrl 进行了编码:

NSString *partialURL = [NSString stringWithFormat:@"/%@", commentBody];
NSString *fullURL = [NSString stringWithFormat:@"%@%@", CONST_URL, partialURL];
NSString *encStr = [fullURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url = [NSURL URLWithString:encStr];

但是随后,commentBody传入的 url 仍然有*()$东西并且没有编码成 utf8。

正确的方法是什么?谢谢!

4

1 回答 1

1
NSString * test = (NSString *) CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, 
                                                                            (CFStringRef)validUrl,
                                                                            NULL, 
                                                                            (CFStringRef)@";/?:@&=$+{}<>,",
                                                                            kCFStringEncodingUTF8);

更新

嗨@Rendy。对不起昨天的快速回复。在跳下之前,我只有时间经过一个 1 班轮,并希望这足以让您纠正您遇到的问题。

您总是希望对 URL 的参数进行编码。如果您的 URL 是另一个 URL 的参数或嵌入在某些 XML 中;您需要对整个 url 进行编码(这意味着参数会被双重编码 - 因为您采用“有效” URL 并将其转义,因此它成为另一个 URL 中的有效参数(即,:并被&转义,因此参数不会混合在一起。)

如果您愿意,您可以在下面的字符串中添加额外的字符,它们将被百分比编码值替换。我相信下面的字符串已经涵盖了无效值。

这是一个类别NSString

@implementation NSString (encode)

+ (NSString*)stringEncodedAsUrlParameter:(NSString *)string
{
    NSString *newString = NSMakeCollectable(
                [(NSString *)CFURLCreateStringByAddingPercentEscapes(
                                                                     kCFAllocatorDefault,
                                                                     (CFStringRef)string,
                                                                     NULL, /* charactersToLeaveUnescaped */
                                                                     CFSTR(":/?#[]@!$ &'()*+,;=\"<>%{}|\\^~`"),
                                                                     kCFStringEncodingUTF8
                                                                     ) autorelease]
                );

    if (newString) {
        return newString;
    }
    return @"";
}


- (NSString*)stringByEncodingAsUrlParameter
{
    return [NSString stringEncodedAsUrlParameter:self];
}

@end

像这样称呼它:

NSString * escapedParameters = [NSString stringEncodedAsUrlParameter:unescapedParameters];

或者:

NSString * escapedParameters = [unescapedParameters stringByEncodingAsUrlParameter];

然后将正确转义的参数添加到 URL 的末尾。如果您对整个 URL 进行编码,您将对“http://”部分进行编码,但它不起作用。

我最初从 ASIHttpRequest 复制了以上内容,但添加的任何错误都是我的。

希望有帮助!祝你好运!!

于 2013-02-04T03:09:52.910 回答