ios - 将字符串转换为 URL

标签 ios swift string url

我无法将此字符串转换为 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/

相关文章:

ios - 向 uisearchbar 添加刷新 Logo

php - 通过 PHP 将 MySQL 记录发送到 iOS

ios - 使用 performSegueWithIdentifier() 向标识符添加撇号

ios - UITableView 以编程方式未显示

swift - 从一个类调用另一个类的函数,Xcode 错误

ios - 无法在 Objective-C 单元测试中使用 Swift 类

java - 关于单词搜索算法的问题

java - 将长日志行分成两部分的性能问题

ios - 来自 appDelegate 时的 performSegue 错误

谁能解释一下这段代码在c中排列字符串的工作原理吗?