如何在NSUrl中传递*()$ etc?

时间:2013-02-04 03:06:20

标签: ios nsurl

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

我用这种方式编写了NSUrl:

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

但是,在网址中传递的commentBody仍然有*()$个内容,而不是编码为utf8。

这样做的正确方法是什么? 谢谢!

1 个答案:

答案 0 :(得分:1)

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

<强>更新

嗨@Rendy。对不起昨天的快速回复。在跳下之前我只有时间通过​​一个班轮,并希望你能纠正你遇到的问题。

您始终希望对URL的参数进行编码。如果您有一个URL作为另一个URL的参数或嵌入在某些XML中;你想要编码整个url(这意味着参数得到双重编码 - 因为你获取一个“有效”的URL并将其转义,因此它成为另一个URL中的有效参数(即:和{{1获取转义,因此参数不会混合在一起。)

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

以下是&上的类别:

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];

然后将正确转义的参数添加到您的网址末尾。如果您对整个URL进行编码,则会对“http://”部分进行编码,但它将无效。

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

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