我无法将此字符串转换为 URL URL 字符串:“http://someurl.com/Files/مواد غذاوو ماکارونی/6260100339286.jpg”
我尝试使用此代码但出现错误(无法解包):
let standardString = string.addingPercentEncoding(withAllowedCharacters: .alphanumerics)
URL(String: standardString)!
最佳答案
您的方法是对 :
和 /
字符进行编码。不要尝试手动编码复杂的 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 中,\
和 /
之间的字母排序没有区别(它们都被认为是“无序的” ).这意味着当您将它写入字符串时,正确的内存布局是不明确的。应该是“ك”然后是“/”然后是“كتب”还是“كتب”然后是“/”然后是“ك”?
(您会注意到我一直在我的阿拉伯语之间添加“then”。那是因为如果我使用 ,
会导致相同的排序问题。我必须在我的阿拉伯语之间添加一些 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 之间切换的所有歧义。
关于ios - 将字符串转换为 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50745025/