2016-03-14 3 views
3

У меня есть wkwebview, который работает как браузер. Я не могу загружать адреса со специальными символами, такими как «http://www.håbo.se» (шведский символ).WKWebView загружает веб-страницу со специальными символами

Я использую:

parsedUrl = [parsedUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 

, который является перспективным, поскольку он создает адрес, который выглядит следующим образом: http://www.h%c3%a5bo.se/

Если я вхожу, что в Chrome он работает. Но когда я пытаюсь загрузить его в wkwebview я получаю следующее (я могу загрузить все другие страницы):

Вот полный NSError печататься

Error Domain=NSURLErrorDomain Code=-1003 "A server with the specified hostname could not be found." UserInfo={_WKRecoveryAttempterErrorKey=<WKReloadFrameErrorRecoveryAttempter: 0x7f82ca502290>, NSErrorFailingURLStringKey=http://www.h%c3%a5bo.se/, NSErrorFailingURLKey=http://www.h%c3%a5bo.se/, NSUnderlyingError=0x7f82ca692200 {Error Domain=kCFErrorDomainCFNetwork Code=-1003 "A server with the specified hostname could not be found." UserInfo={NSErrorFailingURLStringKey=http://www.h%c3%a5bo.se/, NSErrorFailingURLKey=http://www.h%c3%a5bo.se/, _kCFStreamErrorCodeKey=8, _kCFStreamErrorDomainKey=12, NSLocalizedDescription=A server with the specified hostname could not be found.}}, 

ответ

2

Это одна сложная. От this article:

преобразуя доменное имя

Если строка, которая представляет имя домена не в Unicode, то агент пользователя преобразует строку в Unicode. Затем он выполняет некоторые функции нормировкив строке, чтобы устранить неоднозначность, которая может существовать в кодировке Unicode в формате .

Нормализация включает такие вещи, как преобразование символов верхнего регистра в нижнем регистре, уменьшая альтернативные представления (например. Преобразования половину ширины кана до полного), исключая запрещенные символы (например. пространства), и т.д.

Далее, пользовательский агент преобразует каждую из меток (т. е. фрагменты текста между точками) в строке Unicode в представление punycode. A специальный маркер ('xn--') добавляется к началу каждой метки , содержащей символы, отличные от ASCII, чтобы показать, что метка не была изначально ASCII. Конечный результат не очень удобен для пользователя, но точно представляет исходную строку символов, используя только те символы, которые ранее были разрешены для доменных имен.

Например, после доменного имени:

JP 納豆 例 .jp

преобразует к следующему представлению:

Xn - JP-cd2fp15c.xn. --fsq.jp

Для этого преобразования вы можете использовать following code.

Разрешающего путь

Если строка вводится пользователем или хранятся в не-Unicode кодирования, он преобразуется в Unicode, нормированный с помощью Юникод Нормализация формы C, и кодируется с использованием кодирование UTF-8.

Затем пользовательский агент преобразует байты, отличные от ASCII, в проценты.

Например, следующий путь:

/dir1/引 き 割 り .html

преобразует в следующем представлении:

/dir1 /% E5% до н.э.% 95% E3% 81% 8D% E5% 89% B2% E3% 82% 8A.html

Для этой цели вы можете использовать следующий код:

path = [URL.path stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLPathAllowedCharacterSet]]; 

Обратите внимание, что stringByAddingPercentEscapesUsingEncoding: является устаревшим, так как каждый компонент URL или подкомпонент имеет различные правила для того, что символы являются действительными.

Собираем все вместе

Результирующий код:

@implementation NSURL (Normalization) 

- (NSURL*)normalizedURL { 
    NSURLComponents *components = [NSURLComponents componentsWithURL:self resolvingAgainstBaseURL:YES]; 
    components.host = [components.host IDNAEncodedString]; // from https://github.com/OnionBrowser/iOS-OnionBrowser/blob/master/OnionBrowser/NSStringPunycodeAdditions.h 
    components.path = [components.path stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLPathAllowedCharacterSet]]; 
    return components.URL; 
} 

@end 

К сожалению, фактический URL "нормализация" гораздо сложнее - вам нужно обрабатывать все остальные компоненты URL тоже. Но я надеюсь, что я ответил на ваш вопрос.

+0

Благодарим за отзыв, я не думал, что это необходимо для конвертации в IDN. Я использовал это: https://github.com/wordpress-mobile/NSURL-IDN И преобразовал строку перед созданием NSURL, и это работает как шарм. –