NSURL является нулевым, в то время как NSString является правильным в Objective-C - PullRequest
5 голосов
/ 13 декабря 2011

У меня есть NSString, содержащий URL, и когда я выделяю NSURL с выходами NSString, NSURL (ноль). Это потому, что в URL есть несколько недопустимых символов, которые NSURL не может прочитать без кодирования NSString, содержащего URL.

NSString *u = [incomingUrlString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

NSURL *url = [NSURL URLWithString:u];

NSLog(@"INCOMINGURLSTRING: %@" , u);
NSLog(@"URL: %@" , url);

Вывод:

 INCOMINGURLSTRING: /url/path/fileName_blå.pdf
 URL: (null)

Входящая строка содержит норвежскую букву "å", которая, как мне кажется, является причиной того, что NSURL (ноль)

Я тоже пробовал это:

NSString *trimmedString = [file stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
NSString *encodedString = (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)trimmedString, NULL, (CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ", kCFStringEncodingUTF8);

NSLog(@"TRIMMEDSTRING: %@" , trimmedString);
NSLog(@"ENCODEDSTRING: %@" , [encodedString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]);

NSURL *url = [NSURL URLWithString:encodedString];

NSLog(@"URL: %@" , url);

Здесь вывод:

 TRIMMEDSTRING: /url/path/fileName_blå.pdf
 ENCODEDSTRING: /url/path/fileName_blå.pdf
 URL: %2Furl%2FPath%2FfileName_bl%C3%A5.pdf

Моя цель - загрузить URL в UIWebView. Он работает для всех остальных входящих URL-адресов, кроме этого, все они выглядят одинаково, за исключением имени файла. Это единственный контакт с нелегальным персонажем. Но я должен найти способ закодировать это, потому что в будущем будет больше файлов, связывающихся с "æ", "ø" или "å".

Я знаю, что вывод не выглядит корректно в соответствии со стандартами URL, что я сделал специально. Я не могу показать правильный URL с http://blah бла из соображений безопасности.

Может кто-нибудь помочь?

Ответы [ 4 ]

11 голосов
/ 13 декабря 2011

Метод, который вы используете для процентного кодирования символов в строке, также экранирует допустимые символы URL.Это было бы целесообразно, если бы вы кодировали параметр URL, в этом случае было бы лучше просто использовать stringByAddingPercentEscapesUsingEncoding:, поскольку он оставляет символы, являющиеся частью структуры URL (':', '/' и т. Д.)нетронутым:

NSString *u = @"http://example/path/fileName_blå.pdf";
u = [u stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url = [NSURL URLWithString:u];
NSLog(@"%@", url); // http://example.com/path/fileName_bl%C3%A5.pdf
2 голосов
/ 13 декабря 2011

Если у вас есть URL, который является путем к файлу, вы должны использовать + (id)fileURLWithPath:(NSString *)path.Для метода URLWithString: строка должна содержать схему типа file:// или http://.

1 голос
/ 07 сентября 2018

stringByAddingPercentEscapesUsingEncoding устарело.

Новый способ (iOS 7+) сделать это:

NSString *encoded = [raw stringByAddingPercentEncodingWithAllowedCharacters:NSCharacterSet.URLPathAllowedCharacterSet];

Путь к файлу определяется https://tools.ietf.org/html/rfc8089.
Ключевая часть - разрешить символы . и / и запретить %. CharacterSet.urlPathAllowed соответствует требованиям.

Вывод с вашим примером:

InputString: /url/path/fileName_blå.pdf
encodedString: /url/path/fileName_bl%C3%A5.pdf
URL: /url/path/fileName_bl%C3%A5.pdf

0 голосов
/ 14 апреля 2013

Я также обнаружил, что для некоторых символов Северной Европы NSIOLatin1StringEncoding подходит лучше.

- (void) testEncoding {
    NSString * urlString = @"http://example/path/fileName_blå.pdf";
    urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSISOLatin1StringEncoding];
    NSURL * url = [NSURL URLWithString:urlString];
    NSLog(@"URL: %@", url);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...