将 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 5、Swift 4 和 Swift 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 转换为字符串并再次返回的主要内容,如果未能解决你的问题,请参考以下文章
从 Array(保存整数)创建 ArrayBuffer 并再次返回