2008-09-05 3 views
6

В приложении, которое я пишу у меня есть некоторый код, как это:Открытие нестандартной URL в приложении какао

NSWorkspace* ws = [NSWorkspace sharedWorkspace]; 
NSString* myurl = @"http://www.somewebsite.com/method?a=%d"; 

NSURL* url = [NSURL URLWithString:myurl]; 

[ws openURL:url]; 

Основное различие в том, что myurl приходит откуда-то вне моего контроля. Обратите внимание на% d в URL-адресе, который не совсем корректен и означает, что URLWithString не удалось, возвращая ноль.

Что такое «правильный» способ обращения с этим? Нужно ли мне разбирать строку и правильно кодировать аргументы? Или есть какой-то умный метод в Какао, который делает всю тяжелую работу для меня?

ответ

2

Я считаю, что поведение здесь верно, потому что% d не является допустимым компонентом URL-адреса (% - это побег, но ожидает, что за ним последуют два шестнадцатеричных символа).

Вы не можете просто кодировать URL-адрес, как указано вам, потому что это также закодирует/s и? S, чего вы не хотите.

Итак, вопрос в том, что здесь правильное поведение?

Может быть, вы хотите, чтобы превратиться в ...

http://www.somewebsite.com/method?a=%25d 

(т.е.% является кодирование в закодированном версии% в URL, поэтому, когда метод получает входной сигнал, он видит, как устанавливается на% d)

Я не думаю, что есть какая-либо функция библиотеки, которая сделает для вас что-то подобное, так как нет «правильного» способа сделать это. О он только правильно, что вы можете сделать, это вернуть сообщение об ошибке сказав, что URL вы получили недействителен (так же, как URLWithString есть)


Если вы хотите, чтобы попытаться справиться вход, я думаю, вы должны были бы найдите URL-адрес для любых символов%, за которыми сразу не следуют два шестнадцатеричных символа, а затем замените% на% 25 в этом случае. Это должно быть вполне возможно с регулярным выражением, хотя я подозреваю, что могут возникнуть некоторые дополнительные сложности, если ваши URL-адреса начнут содержать кодированные версии символов вне набора символов ASCII.

1

К сожалению, вы должны быть умнее, чем обеспечивается Apple:

stringByAddingPercentEscapesUsingEncoding: 

Это будет избежать всех недопустимые символы URL, так что «http://foo.com/hey%20dude/», которая действует, становится «http://foo.com/ hey% 2520dud/", чего мы не хотим.

Согласно яблочной документации: http://developer.apple.com/library/mac/documentation/CoreFOundation/Reference/CFURLRef/Reference/reference.html#//apple_ref/c/func/CFURLCreateStringByAddingPercentEscapes

Я сделал категорию NSURL, который делает правильную вещь и работает с нечетной строкой, такими, как те, с частичным кодированием (т.е. «http://foo.com/hey чувак/я % 20do% 20it/").

Вот код:

@interface NSURL (SmartEncoding) 
+ (NSURL *)smartURLWithString:(NSString *)str; 
@end 

@implementation NSURL (SmartEncoding) 

+ (NSURL *)smartURLWithString:(NSString *)str 
{ 
    CFStringRef preprocessed = CFURLCreateStringByReplacingPercentEscapesUsingEncoding(NULL, (CFStringRef)str, CFSTR(""), kCFStringEncodingUTF8); 
    if (!preprocessed) 
     preprocessed = CFURLCreateStringByReplacingPercentEscapesUsingEncoding(NULL, (CFStringRef)str, CFSTR(""), kCFStringEncodingASCII); 

    if (!preprocessed) 
     return [NSURL URLWithString:str]; 

    CFStringRef sanitized = CFURLCreateStringByAddingPercentEscapes(NULL, preprocessed, NULL, NULL, kCFStringEncodingUTF8); 
    CFRelease(preprocessed); 
    NSURL *result = (NSURL*)CFURLCreateWithString(NULL, sanitized, NULL); 
    CFRelease(sanitized); 
    return [result autorelease]; 
} 

@end 

Он отлично работает с UTF8 строки закодированных и ASCII из них.

Смежные вопросы