我无法将此字符串转换为网址 URL字符串:“http://someurl.com/Files/موادغذایی/برنجوماکارونی/ 6260100339286.jpg”
我尝试使用此代码但出错(无法打开):
let standardString = string.addingPercentEncoding(withAllowedCharacters: .alphanumerics)
URL(String: standardString)!
答案 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)