【问题标题】:NSString encoding returns nil on url contentNSString 编码在 url 内容上返回 nil
【发布时间】:2016-04-13 18:23:51
【问题描述】:

我正在关注 Udemy 上的 iOS Swift 指南,这是我无法解决的第一个问题:

我应该看到 html 等打印到控制台,但我得到了 null。

这是部分:

    let url = NSURL(string: "https://google.com")
    let task = NSURLSession.sharedSession().dataTaskWithURL(url!) {
        (data, response, error) in
        if error == nil {
            var urlContent = NSString(data: data!, encoding: NSUTF8StringEncoding)
            print(urlContent)
        }
    } 
    task.resume()

如果我只打印数据,那么它会给我一些内容,但是当它编码时它为零。

有什么帮助吗?在解决此问题之前无法进入下一部分。

【问题讨论】:

  • 如果data 不是nilurlContent 是,那么这意味着数据不代表UTF-8 编码的字符串。它可能是另一种编码,也可能不是字符串数据。
  • 这可能有用:stackoverflow.com/a/32051684/1187415,它是一种从 HTTP 响应标头中检测编码的方法。如果这不起作用,请尝试 NSWindowsCP1252StringEncoding 或 NSISOLatin1StringEncoding。

标签: ios swift nsstring nsurl


【解决方案1】:

rmaddy 已经提到的问题是您使用的编码。您需要使用NSASCIIStringEncoding

if let url = URL(string: "https://www.google.com") {
    URLSession.shared.dataTask(with: url) {
        data, response, error in
        guard
            let httpURLResponse = response as? HTTPURLResponse, httpURLResponse.statusCode == 200,
            let data = data, error == nil,
            let urlContent = String(data: data, encoding: .ascii)
        else { return }
        print(urlContent)
    }.resume()
}

或者从 Martin R 那里获取线索,您可以从响应中检测字符串编码:

extension String {
    var textEncodingToStringEncoding: Encoding {
        return Encoding(rawValue: CFStringConvertEncodingToNSStringEncoding(CFStringConvertIANACharSetNameToEncoding(self as CFString)))
    }
}

if let url = URL(string: "https://www.google.com") {
    URLSession.shared.dataTask(with: url) {
        data, response, error in
        guard
            let httpURLResponse = response as? HTTPURLResponse, httpURLResponse.statusCode == 200,
            let data = data, error == nil,
            let textEncoding = response?.textEncodingName,
            let urlContent = String(data: data, encoding: textEncoding.textEncodingToStringEncoding)
            else { return }
        print(urlContent)
    }.resume()
}

【讨论】:

    猜你喜欢
    • 2021-06-14
    • 1970-01-01
    • 2013-09-07
    • 1970-01-01
    • 1970-01-01
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多