如何编码网址

时间:2011-01-27 09:24:15

标签: iphone objective-c url

NSString* urlEncode(NSString * url)
{
    string inStr = StringFromNSString(url);
    CFStringRef inStringRef = CFStringCreateWithCString( kCFAllocatorDefault, inStr.c_str(), kCFStringEncodingUTF8 );
    NSString * encodedString = (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,(CFStringRef)inStringRef,NULL,(CFStringRef)@"!*’();:@&=+$,/?%#[]",kCFStringEncodingUTF8 );
    return encodedString;
}

我使用上面的方法来编码网址...即使我的应用程序崩溃说

<body>
    <div id="content">
        <h1>An Error Was Encountered</h1>
        <p>The URI you submitted has disallowed characters.</p> </div>
</body>
</html>
terminate called after throwing an instance of 'std::invalid_argument'
  what(): 

任何想法..我的代码出了什么问题?

仅供参考:它在这个方法中崩溃JSONNode jsonObject0 = libJSON :: parse(inResponseData);

更新:我发送消息的服务器是UNIX服务器导致问题吗?

7 个答案:

答案 0 :(得分:5)

您无需创建inStrinStringRef临时变量。类型NSString*CFStringRef是“免费桥接”类型。这些类型只需简单的演员即可互换。

您可以在此处找到有关免费桥接的更多信息:http://www.mikeash.com/pyblog/friday-qa-2010-01-22-toll-free-bridging-internals.html

也就是说,您可以将方法简化为以下内容:

-(NSString*) urlEncode
{
    NSString *encodedString = (NSString *)CFURLCreateStringByAddingPercentEscapes( NULL, (CFStringRef)self, NULL, (CFStringRef)@"!*'();:@&=+$,/?%#[]", kCFStringEncodingUTF8 );
    return [encodedString autorelease];
}

以上最好作为NSString类别实现(注意使用self作为编码值。)

答案 1 :(得分:2)

这对我来说很好。我使用CFSTR而不是(CFStringRef)@“!*'();:@&amp; = + $,/?%#[]”

- (NSString *)encodedURLParameterString {
    NSString *result = (NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
                                                                       (CFStringRef)self,
                                                                       NULL,
                                                                       CFSTR(":/=,!$& '()*+;[]@#?"),
                                                                       kCFStringEncodingUTF8);
    return [result autorelease];
 }

答案 2 :(得分:2)

你可以试试这个

NSString *sampleUrl = @"http://www.google.com/search.jsp?params=Java Developer";
NSString* encodedUrl = [sampleUrl stringByAddingPercentEscapesUsingEncoding:
 NSASCIIStringEncoding];

答案 3 :(得分:1)

您需要确保您的URL编码不是您需要的。如果您打算将此编码字符串用作实际URL的一部分,那么您应该知道只有部分URL应该被编码,即查询字符串(还有其他位,但是95%的情况下,这与查询有关。)

换句话说,您的网址应为:

scheme://host/path?<key>=<value>&<key>=<value>

在此, ONLY 尖括号内的内容(<key><value>)应为URL编码。

答案 4 :(得分:1)

这是UNIX服务器中的问题......它提供了错误的数据。

答案 5 :(得分:1)

NSString *encodedstring = (__bridge NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,
                                                                                          (__bridge CFStringRef)yoururlstring,
                                                                                          NULL,
                                                                                       (CFStringRef)@"!*'();:@&=+$,/?%#[]",
                                                                                       kCFStringEncodingUTF8);

此代码完美无缺

答案 6 :(得分:0)

以下是对格式化的URLString进行编码的最佳方法:

urlString = [urlString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];

而不是使用下面因为它有一些内存管理问题。

NSString *encodedstring = (__bridge NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,
                                                                                      (__bridge CFStringRef)yoururlstring,
                                                                                      NULL,
                                                                                   (CFStringRef)@"!*'();:@&=+$,/?%#[]",
                                                                                   kCFStringEncodingUTF8);