将字符串转换为URL

时间:2018-06-07 15:26:56

标签: ios swift string url

我无法将此字符串转换为网址 URL字符串:“http://someurl.com/Files/موادغذایی/برنجوماکارونی/ 6260100339286.jpg”

我尝试使用此代码但出错(无法打开):

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

2 个答案:

答案 0 :(得分:4)

您的方法是对:/字符进行编码。不要尝试手工编码复杂的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。网址不能包含阿拉伯语;它必须是百分比编码,这消除了所有歧义。

虽然阿拉伯语的斜线是向后的,但在Unicode中,\/之间没有区别用于字母排序(它们都被认为是“无序的”)。这意味着当您在字符串中写入时,“ك/كتب”的正确内存布局是不明确的。它应该是“ك”然后是“/”然后是“كتب”或“كتب”然后是“/”然后是“ك”吗?

(你会注意到我一直把“然后”放在我的阿拉伯语之间。那是因为如果我使用,它会导致相同的排序问题。我必须在我要订购的阿拉伯语之间放一些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之间切换的所有歧义。

答案 1 :(得分:0)

var str = "http://someurl.com/Files/مواد غذایی/برنج و ماکارونی/6260100339286.jpg"
str = str.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!
let url = URL(string: str)