Открытие нестандартного URL в приложении Какао - PullRequest
6 голосов
/ 05 сентября 2008

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

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 завершается ошибкой, возвращая nil .

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

Ответы [ 3 ]

8 голосов
/ 05 сентября 2008

Я не уверен, что это именно то, что вы ищете, но в NSString есть метод, который очистит URL:

stringByAddingPercentEscapesUsingEncoding:

2 голосов
/ 05 сентября 2008

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

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

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

Возможно, вы бы хотели, чтобы оно превратилось в ...

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

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

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


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

1 голос
/ 29 декабря 2011

К сожалению, вы должны быть умнее, чем предусмотрено 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 dude / i% 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...