将字符串转换为 URL

omi*_*yan 2 string url ios swift

我无法将此字符串转换为 URL URL 字符串:" http://someurl.com/Files/???? ?????/???? ? ????????/6260100339286.jpg ”

我尝试使用此代码但收到错误(无法解包):

let standardString = string.addingPercentEncoding(withAllowedCharacters: .alphanumerics) 
URL(String: standardString)!
Run Code Online (Sandbox Code Playgroud)

Rob*_*ier 6

您的方法是对:/字符进行编码。不要尝试手动编码复杂的 URL。不同的部分具有不同的法律特征。让系统为你做。

var components = URLComponents(string: "http://someurl.com")!
components.path = "/Files/6260100339286/???? ?????/???? ? ????????.jpg"
components.url
Run Code Online (Sandbox Code Playgroud)

这正确编码了 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
Run Code Online (Sandbox Code Playgroud)

请注意,您的问题中的阿拉伯语存在一个微妙的问题,这可能是造成混淆的原因。目前尚不清楚编码是否应该是:

/Files然后/6260100339286然后/???? ? ????????然后/???? ?????

或者

/Files然后 /???? ? ????????然后/???? ? ????????然后 /6260100339286.jpg

这种混淆的原因是使这些编码含糊不清的双向规则。暂时忘记 URL,你认为这个字符串的“第一”层次是什么:

? \ ???
Run Code Online (Sandbox Code Playgroud)

我想说我们都同意它是“?”。那么这个呢?

? / ???
Run Code Online (Sandbox Code Playgroud)

斜线是向后的,但 Unicode 不区分/\。如果那是“?” 第一个,这个呢?

http://?/???
Run Code Online (Sandbox Code Playgroud)

这应该在什么方向上解析?URL 规范对此非常清楚:这是一个无效的 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!)
Run Code Online (Sandbox Code Playgroud)

这种方法消除了在 LTR 和 RTL 之间切换的所有歧义。