为什么Cocoa不喜欢这个URL?

时间:2009-08-18 06:53:30

标签: objective-c cocoa

我想在Cocoa应用程序中提交以下URL并将结果保存为字符串(尽管XML可能更好):

http://translate.google.com/translate_t#en|fr|hi%20there%20all

页面不断返回错误。这是我的代码:

NSString *urlString = @"http://translate.google.com/translate_t#en|fr|hi%20there%20all";
urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url = [NSURL URLWithString:urlString];
NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:10];
NSData *urlData;
NSURLResponse *response;
NSError *error;
urlData = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&response error:&error];

NSString *content = [[NSString alloc]  initWithBytes:[urlData bytes]

以上原因导致网址变为:

http://translate.google.com/translate_t%23en%7Cfr%7Chi%2520there%2520all

这导致来自Google的404。如果我在没有转义的情况下尝试URL,我会返回零字节。关于如何使这项工作的任何想法?

---编辑---

问题的根源是url的值为nil。删除EscapesUsingEncoding行(第2行)并检查url的值。我在URL中的管道正在导致     [NSURL URLWithString:urlString]; 返回零。使用十六进制值7C(http://translate.google.com/translate_t#en%7cfr%7chi%20there%20all)转义管道,返回数据。但是我在NSString *内容行上再次获得零字节。

2 个答案:

答案 0 :(得分:6)

问题是你正在逃避#Transding,这是谷歌翻译所需要的,以弄清楚发生了什么。事实上,鉴于您传递的URL包含%20(空格),那么您实际上根本不需要URL转义码 - 您可以按原样使用您的文字。

如果您是从NSTextField或类似文件构建它,只需在textValue上运行URL转义,然后再添加前缀。

答案 1 :(得分:1)

你似乎是双重逃避百分号(看看如果你将最后的字符串带入Safari它也不会加载,giivng 404)。

这导致%20变为%2520(%25为%符号)。而且,根本不逃避不逃避#和|迹象。

您的原始字符串应为:

http://translate.google.com/translate_t#en|fr|hi there all