преобразовать строку в URL - PullRequest
0 голосов
/ 07 июня 2018

Я не могу преобразовать эту строку в строку URL URL: "http://someurl.com/Files/مواد غذایی / برنج و ماکارونی / 6260100339286. Jpg"

Я пытался с этими кодами, но получил ошибку (может 't развернуть):

let standardString = string.addingPercentEncoding(withAllowedCharacters: .alphanumerics) 
URL(String: standardString)!

Ответы [ 2 ]

0 голосов
/ 07 июня 2018
var str = "http://someurl.com/Files/مواد غذایی/برنج و ماکارونی/6260100339286.jpg"
str = str.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!
let url = URL(string: str)
0 голосов
/ 07 июня 2018

Ваш подход заключается в кодировании символов : и /.Не пытайтесь вручную кодировать сложные 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...