NSUTF8StringEncoding给我这个%0A%20%20%20%20%22http://example.com/example.jpg%22%0A

时间:2013-11-09 03:23:39

标签: ios objective-c utf-8 nsstring nsurl

我正在尝试从twitter加载图片。如果我只是在没有编码的情况下使用json结果中的URL,那么在dataWithContentsOfURL中,我会得到nil URL参数。如果我编码它,我会得到以下

  

%0A%20%20%20%20%22http://example.com/example.jpg%22%0A

我知道我可以使用rangeOfString:stringByReplacingOccurrencesOfString:但是我可以确定它会一直相同吗,还有另一种处理方式吗?为什么这会发生在我的Twitter响应和不是我的Instagram响应?

我也试过

stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]

它什么也没做。

这是直接来自json的网址......

2013-11-08 22:09:31:812 JaVu[1839:1547] -[SingleEventTableViewController tableView:cellForRowAtIndexPath:] [Line 406] (
    "http://pbs.twimg.com/media/BYWHiq1IYAAwSCR.jpg"
)

这是我的代码

if ([post valueForKeyPath:@"entities.media.media_url"]) {
        NSString *twitterString = [[NSString stringWithFormat:@"%@", [post valueForKeyPath:@"entities.media.media_url"]]stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
        twitterString = [twitterString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
        NSLog(@"%@", twitterString);

        if (twitterString != nil){
            NSURL *twitterPhotoUrl = [NSURL URLWithString:twitterString];
            NSLog(@"%@", twitterPhotoUrl);
            dispatch_queue_t queue = kBgQueue;
            dispatch_async(queue, ^{
                NSError *error;
                NSData* data = [NSData dataWithContentsOfURL:twitterPhotoUrl options:NSDataReadingUncached error:&error];
                UIImage *image = [UIImage imageWithData:data];

                dispatch_sync(dispatch_get_main_queue(), ^{
                    [streamPhotoArray replaceObjectAtIndex:indexPath.row withObject:image];
                    cell.instagramPhoto.image = image;
                });
            });
        }
    }

3 个答案:

答案 0 :(得分:1)

%0A%20%20%20%20%22代表\n,后跟4个空格,然后是"。这与控制台中的描述一致。您是否使用NSJSONSerialization从JSON数据中获取URL?

答案 1 :(得分:1)

不是答案,而是解决错误的一步,:将代码更改为此并发布输出。将多个方法调用合二为一会使调试更加困难。

NSLog(@"post: '%@", post);
NSString * twitterString;
twitterString = [post valueForKeyPath:@"entities.media.media_url"];
NSLog(@"twitterString 1: '%@", twitterString);
twitterString = [twitterString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
NSLog(@"twitterString 2: '%@", twitterString);
        twitterString = [twitterString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSLog(@"twitterString 3: '%@", twitterString);

BTW,[NSString stringWithFormat:@"%@"...不是必需的。

答案 2 :(得分:1)

您显示的日志输出似乎是一个数组,因为它的字符串在一个单独的行上有括号。

如果字符串已经是有效的URL字符串,那么你不应该对字符串进行编码,事实上这样做是错误的并且会破坏它。