Ваш подход заключается в кодировании символов :
и /
.Не пытайтесь вручную кодировать сложные URL-адреса.Различные части имеют разные юридические символы.Пусть система сделает это за вас.
var components = URLComponents(string: "http://someurl.com")!
components.path = "/Files/6260100339286/مواد غذایی/برنج و ماکارونی.jpg"
components.url
Это правильно кодирует URL:
http://someurl.com/Files/6260100339286/%D9%85%D9%88%D8%A7%D8%AF%20%D8%BA%D8%B0%D8%A7%DB%8C%DB%8C/%D8%A8%D8%B1%D9%86%D8%AC%20%D9%88%20%D9%85%D8%A7%DA%A9%D8%A7%D8%B1%D9%88%D9%86%DB%8C.jpg
Обратите внимание, что в вашем вопросе есть небольшая проблема с арабским, которая, вероятно, является причинойпутаницы.Неясно, предполагается ли кодировка:
/Files
, затем /6260100339286
, затем /برنج و ماکارونی
, а затем /مواد غذایی
.
или
/Files
и затем /برنج و ماکارونی
, а затем /برنج و ماکارونی
, а затем /6260100339286.jpg
Причиной этой путаницы являются правила двунаправленности, которые делают эти кодировки двусмысленными.На мгновение забудем об URL-адресах. Как вы думаете, что «первым» иерархическим уровнем этой строки является:
ك \ كتب
Я бы сказал, что мы все согласимся с тем, что это «ك».Так как насчет этого?
ك / كتب
Косая черта назад, но Unicode не различает /
и \
.И если это сначала «ك», то как насчет этого?
http://ك/كتب
В каком направлении это нужно анализировать?Спецификация URL совершенно ясна по этому поводу: это неверный URL.URL не могут содержать арабский язык;он должен быть закодирован в процентах, что устраняет всю двусмысленность.
Хотя косая черта в обратном направлении для арабского языка, в Юникоде нет разницы между \
и /
для целей упорядочения букв (ониоба считаются "неупорядоченными").Это означает, что правильная компоновка в памяти «ك / كتب» является неоднозначной, когда вы записываете ее в строку.Должно ли это быть "ك", затем "/", затем "كتب" или "كتب", затем "/", затем "ك"?
(Вы заметите, что я продолжаю ставить "тогда" между моим арабским. Это потому, чтоесли бы я использовал ,
, это вызвало бы ту же проблему упорядочения. Я должен поместить текст LTR между арабским, который я хочу заказать LTR.)
Я исправил вышеуказанный код и кодировку, но простоперепечатайте арабский язык и убедитесь, что он в том порядке, в котором, я думаю, вы хотите. Лучшее решение состоит в том, чтобы устранить двусмысленность.Не пишите свои строки таким образом.Создайте их из компонентов пути (что вы на самом деле имеете в виду).
var path = URL(string:"/Files/6260100339286")!
path.appendPathComponent("برنج و ماکارونی")
path.appendPathComponent("مواد غذایی")
path.appendPathExtension("jpg")
var components = URLComponents(string: "http://someurl.com")!
components.path = path.absoluteString
components.url
print(components.url!)
Такой подход устраняет всю двусмысленность при переключении между LTR и RTL.