Это одна сложная. От 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 тоже. Но я надеюсь, что я ответил на ваш вопрос.
Благодарим за отзыв, я не думал, что это необходимо для конвертации в IDN. Я использовал это: https://github.com/wordpress-mobile/NSURL-IDN И преобразовал строку перед созданием NSURL, и это работает как шарм. –