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 {}
Ответы
Ответ 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);
Я не уверен, но я решил использовать это в моем случае.
Надеюсь, это поможет вам.