Подтвердить что ты не робот

IOS: как правильно кодировать URL?

Я не могу открыть URL-адрес в UIWebView, поэтому я нашел и нашел, что мне нужно кодировать URL-адрес, поэтому я попытался его закодировать, но я столкнулся с проблемой в кодировке URL: Мой URL-адрес http://somedomain.com/data/Témp%20Page%20-%20Open.html (Это не настоящий URL).

Я заинтересован в %20, который я попытался заменить с помощью stringByReplacingOccuranceOfString:@"" withString:@"", он дал мне URL-адрес, который мне нужен, как http://somedomain.com/data/Témp Page - Open.html Однако его не открывается в UIWebView, но удивительно он открывается в Safari и FireFox отлично. Даже я открываю некодированный URL, он автоматически преобразует и открывает страницу, которую я ищу.

У меня есть google для кодировки URL, и он указывает мне на разные результаты, которые я уже проверил, но результаты не помогают мне! Я пробовал разные функции ответов в разных вопросах кодировки URL-адресов, но он просто изменил все специальные символы и сделал мой URL как http%3A%2F%2Fsomedomain.com%2Fdata%2FT..., который не может открыться в UIWebView и даже в любом браузере.

Он дает следующее Error Log в UIWebView delegate

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error { }

Код ошибки: 101  и Описание: Error Domain = WebKitErrorDomain Code = 101 "Операция не может быть завершена (ошибка WebKitErrorDomain 101.)" UserInfo = 0x6e4cf60 {}

4b9b3361

Ответ 1

Я сделал несколько тестов, и я думаю, что проблема не в том, что с UIWebView, но вместо этого NSURL не будет принимать URL-адрес из-за того, что é в "Témp" неправильно закодирован. Это приведет к возврату +[NSURLRequest requestWithURL:] и -[NSURL URLWithString:] nil, поскольку строка содержит неверный URL. Я предполагаю, что вы в конечном итоге используете запрос nil с -[UIViewWeb loadRequest:], который не подходит.

Пример:

NSLog(@"URL with é: %@", [NSURL URLWithString:@"http://host/Témp"]);
NSLog(@"URL with encoded é: %@", [NSURL URLWithString:@"http://host/T%C3%A9mp"]);

Вывод:

2012-10-02 12:02:56.366 test[73164:c07] URL with é: (null)
2012-10-02 12:02:56.368 test[73164:c07] URL with encoded é: http://host/T%C3%A9mp

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

UIWebView *webView = [[[UIWebView alloc]
                       initWithFrame:self.view.frame]
                      autorelease];

NSString *url = @"http://www.httpdump.com/texis/browserinfo/Témp.html";

[webView loadHTMLString:[NSString stringWithFormat:
                         @"<script>window.location=%@;</script>",
                         [[[NSString alloc]
                           initWithData:[NSJSONSerialization
                                         dataWithJSONObject:url
                                         options:NSJSONReadingAllowFragments
                                         error:NULL]
                           encoding:NSUTF8StringEncoding]
                          autorelease]]
                baseURL:nil];

Ответ 2

Ответ @Dhaval Vaishnani предоставлен только частично правильно. Этот метод обрабатывает символы ?, = и & как не закодированные, так как они действительны в URL-адресе. Таким образом, для кодирования произвольной строки, которая должна быть безопасно использована как часть URL-адреса, вы не можете использовать этот метод. Вместо этого вы должны вернуться к использованию CoreFoundation и CFURLRef:

NSString *unsafeString = @"this &string= confuses ? the InTeRwEbZ";
CFStringRef safeString = CFURLCreateStringByAddingPercentEscapes (
    NULL,
    (CFStringRef)unsafeString,
    NULL,
    CFSTR("/%&=?$#[email protected]<>|\\*,.()[]{}^!"),
    kCFStringEncodingUTF8
);

Не забудьте избавиться от права собственности на полученную строку, используя CFRelease(safeString);.

Кроме того, похоже, что, несмотря на название, OP ищет строку декодирования, а не кодировку. CFURLRef имеет другой, аналогичный вызов функции, который будет использоваться для этого:

NSString *escapedString = @"%32%65BCDEFGH";
CFStringRef unescapedString = CFURLCreateStringByReplacingPercentEscapesUsingEncoding (
    NULL,
    (CFStringRef)escapedString,
    CFSTR(""),
    kCFStringEncodingUTF8
);

Опять же, не забывайте о правильном управлении памятью.

Ответ 3

Самый простой способ - использовать:

NSString *encodedString = [rawString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

iDhaval был близок, но он делал это наоборот (декодирование вместо кодирования).

Ананд будет работать, но вам, скорее всего, придется заменить больше символов, чем пробелы и новые строки. См. Ссылку здесь: http://en.wikipedia.org/wiki/Percent-encoding#Percent-encoding_reserved_characters

Надеюсь, что это поможет.

Ответ 4

Очень просто кодировать URL-адрес в iPhone. Это выглядит следующим образом:

NSString* strURL = @"http://somedomain.com/data/Témp Page - Open.html";

NSURL* url = [NSURL URLWithString:[strURL stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

Это идеальный способ кодирования URL-адреса, я использую его, и он отлично работает со мной.

Надеюсь, это поможет вам.

Ответ 5

Это может оказаться полезным для тех, кто достигает этого вопроса для кодирования URL-адресов, поскольку мой вопрос, который может быть другим, который был решен и принят, так я использовал для кодирования,

-(NSString *)encodeURL:(NSString *)urlString
{
    CFStringRef newString = CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)urlString, NULL, CFSTR("!*'();:@&[email protected],/?#[]"), kCFStringEncodingUTF8);
    return (NSString *)CFBridgingRelease(newString);
}

Ответ 6

Вы можете попробовать это

NSString *url = @"http://www.abc.com/param=Hi how are you";

NSString* encodedUrl = [url stringByAddingPercentEscapesUsingEncoding:
 NSASCIIStringEncoding];

Ответ 7

Я думаю, что это сработает для вас.

[strUrl stringByAddingPercentEncodingWithAllowedCharacters:NSCharacterSet.URLQueryAllowedCharacterSet]

Нативный метод кодировки URL.

Ответ 8

Вероятно, вам нужно разбить URL-адрес на его составные части, а затем URL-адрес закодировать хост и путь, но не схему. Затем снова положите его обратно.

Создайте NSURL со строкой, а затем используйте методы на нем, такие как хост, схема, путь, запрос и т.д., чтобы разделить его. Затем используйте CFURLCreateStringByAddingPercentEscapes для кодирования частей, а затем вы можете снова объединить их в новый NSURL.

Ответ 9

Swift 4.x

let originalString = "https://www.somedomain.com/folder/some cool file.jpg"
let escapedString = originalString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
print(escapedString!)

Ответ 10

Вы можете попробуй это.

    //yourURL contains your Encoded URL
    yourURL = [yourURL stringByReplacingOccurrencesOfString:@" " withString:@"%20"];
    yourURL = [yourURL stringByReplacingOccurrencesOfString:@"\n" withString:@""];
    NSLog(@"Keyword:%@ is this",yourURL);

Я не уверен, но я решил использовать это в моем случае. Надеюсь, это поможет вам.