将 URL 转换为字符串并再次返回

Posted

技术标签:

【中文标题】将 URL 转换为字符串并再次返回【英文标题】:Converting URL to String and back again 【发布时间】:2015-01-19 15:55:23 【问题描述】:

所以我将NSURL 转换为String。 所以如果我println 它看起来像file:///Users/... 等等。

稍后我想将其作为NSURL 恢复,因此我尝试将其转换回来,如下所示,但我丢失了上面字符串版本中出现的两个正斜杠,这反过来又破坏了@987654326 的代码@ 无效。

为什么我的转换回NSURL从我给它的String中删除了两个正斜杠,我怎样才能转换回包含三个正斜杠的NSURL

var urlstring: String = recordingsDictionaryArray[selectedRow]["path"] as String
println("the url string = \(urlstring)")
// looks like file:///Users/........etc
var url = NSURL.fileURLWithPath(urlstring)
println("the url = \(url!)")
// looks like file:/Users/......etc

【问题讨论】:

在 Swift 5 中,将字符串转换为 url 是 Foundation.URL(string: " ")。 【参考方案1】:

2020 | SWIFT 5.1:

从 STRING 到 URL:

//ver 1 - better to use it for http/https
//BUT DO NOT use for local paths
let url = URL(string:"https://***.com/")

//ver 2 -- for local paths
let url = URL(fileURLWithPath: "//Users/Me/Desktop/Doc.txt")

//ver 3 -- for local folders
let url = URL(fileURLWithPath: "//Users/Me/Desktop", isDirectory: true)

从 URL 到 STRING:

let a = String(describing: url)       // "file:////Users/Me/Desktop/Doc.txt"
let b = "\(url)"                      // "file:////Users/Me/Desktop/Doc.txt"
let c = url.absoluteString            // "file:////Users/Me/Desktop/Doc.txt"
let d = url.path                      // "/Users/Me/Desktop/Doc.txt" 

由于调试过程,d 的值将不可见,所以...

本地文件的最佳解决方案是:

let e = "\(url.path)"                 // "/Users/Me/Desktop/Doc.txt"

网络地址的最佳解决方案是:

let c = url.absoluteString

.path 只会返回 /questions/27062454/converting-url-to-string-and-back-again 为 http(s) 网址 https://***.com/questions/27062454/converting-url-to-string-and-back-again 所以对于 http(s) url,最好使用url.absoluteString

【讨论】:

【参考方案2】:

注意:注意网址,optional,也可以是nil。 您可以将 url 包含在引号中以将其转换为字符串。您可以在操场上对其进行测试。Swift 5、Xcode 11 更新:

import Foundation

let urlString = "http://ifconfig.me"
// string to url
let url = URL(string: urlString)
//url to string
let string = "\(url)"
// if you want the path without `file` schema
// let string = url.path

【讨论】:

应该注意这也返回了方案前缀(想想file:///Users/foo)。如果只需要绝对路径(想想/Users/foo),那么url.path 应该像下面@iphaaw 的回答一样使用。【参考方案3】:

Swift 5Swift 4Swift 3将字符串转换为 URL:

URL(string: String)

或者,

URL.init(string: "yourURLString")

并将 URL 转换为字符串:

URL.absoluteString

下面的将url的“内容”转换为字符串

String(contentsOf: URL)

【讨论】:

第二部分不正确。 String(contentsOf: URL) 返回该资源的实际负载,而不是字符串格式的 URL。使用 URL.absoluteString 获取 URL 的字符串版本。 developer.apple.com/reference/foundation/nsurl/… 您犯了与***.com/a/39967995/2227743 相同的错误,您将 URL 本身转换为字符串与将下载的内容转换为字符串。您应该删除这部分答案,因为它完全错误(或离题,但最终它是错误的,因为它没有回答问题)。 超过 35 人发现这很有用并点赞,我宁愿保持原样。【参考方案4】:

斯威夫特 5.

要将String 转换为URL

let stringToURL = URL(string: "your-string")

要将URL 转换为String

let urlToString = stringToURL?.absoluteString

【讨论】:

【参考方案5】:
let url = URL(string: "URLSTRING HERE")
let anyvar =  String(describing: url)

【讨论】:

【参考方案6】:

Swift 3 与 UIWebViewDelegate 一起使用 shouldStartLoadWith

  func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool 

    let urlPath: String = (request.url?.absoluteString)!
    print(urlPath)
    if urlPath.characters.last == "#" 
        return false
    else
        return true
    


【讨论】:

【参考方案7】:

Swift 3 版本代码:

let urlString = "file:///Users/Documents/Book/Note.txt"
let pathURL = URL(string: urlString)!
print("the url = " + pathURL.path)

【讨论】:

【参考方案8】:

Swift 3(忘记 NSURL)。

let fileName = "20-01-2017 22:47"
let folderString = "file:///var/mobile/someLongPath"

用字符串创建 URL:

let folder: URL? = Foundation.URL(string: folderString)
// Optional<URL>
//  ▿ some : file:///var/mobile/someLongPath

如果我们要添加文件名。请注意, appendingPathComponent() 会自动添加百分比编码:

let folderWithFilename: URL? = folder?.appendingPathComponent(fileName)
// Optional<URL>
//  ▿ some : file:///var/mobile/someLongPath/20-01-2017%2022:47

当我们想要字符串但没有根部分时(注意百分比编码被自动删除):

let folderWithFilename: String? = folderWithFilename.path
// ▿ Optional<String>
//  - some : "/var/mobile/someLongPath/20-01-2017 22:47"

如果我们想保留根部分,我们这样做(但请注意百分比编码 - 它不会被删除):

let folderWithFilenameAbsoluteString: String? = folderWithFilenameURL.absoluteString
// ▿ Optional<String>
//  - some : "file:///var/mobile/someLongPath/20-01-2017%2022:47"

手动为字符串添加百分比编码:

let folderWithFilenameAndEncoding: String? = folderWithFilename.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed)
// ▿ Optional<String>
//  - some : "/var/mobile/someLongPath/20-01-2017%2022:47"

删除百分比编码:

let folderWithFilenameAbsoluteStringNoEncodig: String? = folderWithFilenameAbsoluteString.removingPercentEncoding
// ▿ Optional<String>
//  - some : "file:///var/mobile/someLongPath/20-01-2017 22:47"

百分比编码很重要,因为网络请求的 URL 需要它们,而文件系统的 URL 并不总是有效 - 这取决于使用它们的实际方法。这里需要注意的是,它们可能会被自动删除或添加,因此最好仔细调试这些转换。

【讨论】:

【参考方案9】:

在 Swift 中有一种更好的方式从 NSURL 获取路径的字符串版本:

let path:String = url.path

【讨论】:

但它只会返回 /questions/27062454/converting-url-to-string-and-back-again 用于 url https://***.com/questions/27062454/converting-url-to-string-and-back-again 如果您想将路径用于需要字符串路径的其他一些 FileManager 方法,这实际上非常有用。他们不喜欢file:// 格式。【参考方案10】:

fileURLWithPath() 用于将普通文件路径(例如“/path/to/file”)转换为 URL。你的 urlString 是一个完整的 URL 字符串,包括方案,所以你应该使用

let url = NSURL(string: urlstring)

将其转换回NSURL。示例:

let urlstring = "file:///Users/Me/Desktop/Doc.txt"
let url = NSURL(string: urlstring)
println("the url = \(url!)")
// the url = file:///Users/Me/Desktop/Doc.txt

【讨论】:

优秀。或者现在在 Swift 中:URL(string: urlstring) 也许你需要“urlstring.removingWhitespaces()”,因为当字符串有空格时,URL(string 没有能力工作

以上是关于将 URL 转换为字符串并再次返回的主要内容,如果未能解决你的问题,请参考以下文章

C# 将 20 位精度双精度转换为字符串并再次返回

将NSString转换为NSDate(并再次返回)

从 Array(保存整数)创建 ArrayBuffer 并再次返回

将字典转换为字符串,然后再次返回字典

将列表写入 pandas 数据帧到 csv,从 csv 读取数据帧并再次转换为列表而无需字符串

将可排序列表转换为查询并检索并再次显示