Этот сложный. Из этой статьи:
Разрешение доменного имени
Если строка, представляющая имя домена, не в Юникоде, пользовательский агент преобразует строку в Юникод. Затем он выполняет некоторые функции нормализации строки, чтобы устранить неоднозначности, которые могут существовать в тексте, закодированном в Unicode.
Нормализация включает в себя такие вещи, как преобразование символов верхнего регистра в нижний регистр, сокращение альтернативных представлений (например, преобразование каны половинной ширины в полную), устранение запрещенных символов (например, пробелов) и т. д.
Затем пользовательский агент преобразует каждую из меток (т. е. фрагментов текста между точками) в строке Unicode в представление punycode. В начало каждой метки, содержащей символы, отличные от ASCII, добавляется специальный маркер ('xn--'), чтобы показать, что метка изначально не была ASCII. Конечный результат не очень удобен для пользователя, но точно представляет исходную строку символов, используя только те символы, которые ранее были разрешены для доменных имен.
Например, следующее доменное имя:
JP納豆.例.jp
преобразуется в следующее представление:
xn--jp-cd2fp15c.xn--fsq.jp
Вы можете использовать следующий код для выполнения этого преобразования.
Разрешение пути
Если строка вводится пользователем или сохраняется в кодировке, отличной от Unicode, она преобразуется в Unicode, нормализуется с использованием формы нормализации Unicode C и кодируется с использованием кодировки UTF-8.
Затем пользовательский агент преобразует байты, отличные от ASCII, в процентные escape-последовательности.
Например, следующий путь:
/dir1/引き割り.html
преобразуется в следующее представление:
/dir1/%E5%BC%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-адреса. Но я надеюсь, что ответил на ваш вопрос.
person
Borys Verebskyi
schedule
14.03.2016