尝试URL编码的奇怪输出

时间:2014-03-18 13:20:35

标签: ios objective-c urlencode

我是iOS开发新手,一般是Objective-C,但我已经创建了我正在尝试构建的应用程序的Android版本。开发iOS版本时的当前挂起是我尝试url编码字符串的问题。我尝试了两种不同的方法,都输出了同样非常奇怪的结果。

@implementation NSString (PhantomEx)
-(NSString *)urlEncode
 {
    NSLog(self);

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

    NSLog(encodedString);
    return encodedString;
  }

@end

调用时,第一个NSLog输出一个非常精细的未编码字符串:

http://api.example.com/?userid=42&cmd={"cmd":"CheckLogin","data":{
  "username" : "joe@example.com",
  "password" : "verysecurepassword"
}}&auth=08fef10b96ac69fcc4bdcf09c3e3d851 

而第二个NSLog输出:

2014-03-18 12:52:06.228 phantom[9706:60b] http0X1.1A8A9AP-10470.0000000.000000api.example.com0.0000000.000000userid2610411153                         pmd193317                     –md23AheckLogin22C             148133072ata23A7-0X1.FCF0808D30DP+0220                 10764sername2200X1.2E0C2351534P-1028222joe                           5.902543e-310xample.com22C0X1.463C008D30DP-882220             0x1a8321cassword2200X1.70101P-1020222verysecurepassword20A1390253627800088        0x1.006a0c88p-1040uth360473608fef10b96ac69fcc4bdcf09c3e3d851

这个单独的方法产生相同的结果:

-(NSString *)urlEncode
{
    NSString *charactersToEscape = @"!*'();:@&=+$,/?%#[]\" ";
    NSCharacterSet *allowedCharacters = [[NSCharacterSet characterSetWithCharactersInString:charactersToEscape] invertedSet];

    NSString *encodedString = [self stringByAddingPercentEncodingWithAllowedCharacters:allowedCharacters];

    return encodedString;
}

另外,我意识到我正在尝试编码整个网址,而不仅仅是参数,我还没有改变那一点。但是,我不认为它会对当前的问题产生任何影响。

2 个答案:

答案 0 :(得分:0)

我总是毫无问题地使用它。尝试使用较小的字符集,并查看是否可以确定是否有任何单个字符导致问题。同时将第四个参数更改为CFSTR。

-(NSString *)encodeURL:(NSString *)urlString
{
    CFStringRef newString = CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,   (CFStringRef)urlString, NULL, CFSTR("!*'();:@&=+@,/?#[]"), kCFStringEncodingUTF8);
    return (NSString *)CFBridgingRelease(newString);
}

答案 1 :(得分:0)

问题在于日志记录本身,NSLog将第一个参数作为格式字符串并对其进行解析。 将其更改为NSLog(@"%@", encodedString);