Por que meu retorno é nulo, mas se eu pressionar o URL no chrome / safari, posso obter dados?

@IBAction func mainButtonnBeTapped(sender: AnyObject) { let session = NSURLSession.sharedSession() let request = NSURLRequest(URL: NSURL(string: "http://hq.sinajs.cn/list=sz000609")!) let task = session.dataTaskWithRequest(request, completionHandler: { (data, response, error) -> Void in let myString = NSString(data: data, encoding: NSUTF8StringEncoding) println("this is my string: \(myString)") }) task.resume() } 

Eu estou usando o URL acima para tentar obter alguns dados, mas o retorno é nulo, mas eu entro no url no chrome / safari, eu posso obter alguns dados. Eu realmente não sei porque, alguém pode ajudar a explicar?

O texto que você tenta obter provavelmente não é UTF-8, tente com outra codificação, como por exemplo:

 let myString = NSString(data: data, encoding: NSASCIIStringEncoding) 

Atualização: leia a resposta de Martin R sobre como encontrar a codificação correta.

Este servidor HTTP envia um

 Content-Type = application/x-javascript; charset=GBK 

campo de header na resposta, portanto, você obtém a codificação correta da propriedade textEncodingName da NSURLResponse . Isso pode ser convertido em um NSStringEncoding .

Esta é apenas uma tradução da solução apresentada em https://stackoverflow.com/a/19885463/1187415 para o Swift, além de uma verificação simples de erros:

 let session = NSURLSession.sharedSession() let request = NSURLRequest(URL: NSURL(string: "http://hq.sinajs.cn/list=sz000609")!) let task = session.dataTaskWithRequest(request, completionHandler: { (data, response, error) -> Void in var usedEncoding = NSUTF8StringEncoding // Some fallback value if let encodingName = response.textEncodingName { let encoding = CFStringConvertEncodingToNSStringEncoding(CFStringConvertIANACharSetNameToEncoding(encodingName)) if encoding != UInt(kCFStringEncodingInvalidId) { usedEncoding = encoding } } if let myString = NSString(data: data, encoding: usedEncoding) { println("this is my string: \(myString)") } else { println("failed to decode data") } }) task.resume() 

Saída:

 esta é minha string: var hq_str_sz000609 = "绵 世 股份, ....

Pequenas mudanças são necessárias para o Swift 2:

 let session = NSURLSession.sharedSession() let request = NSURLRequest(URL: NSURL(string: "http://hq.sinajs.cn/list=sz000609")!) let task = session.dataTaskWithRequest(request, completionHandler: { (data, response, error) -> Void in var usedEncoding = NSUTF8StringEncoding // Some fallback value if let encodingName = response?.textEncodingName { let encoding = CFStringConvertEncodingToNSStringEncoding(CFStringConvertIANACharSetNameToEncoding(encodingName)) if encoding != UInt(kCFStringEncodingInvalidId) { usedEncoding = encoding } } if let myString = String(data: data!, encoding: usedEncoding) { print("this is my string: \(myString)") } else { print("failed to decode data") } }) task.resume() 

Atualização para o Swift 3:

 let session = URLSession.shared let request = URLRequest(url: URL(string: "http://hq.sinajs.cn/list=sz000609")!) let task = session.dataTask(with: request, completionHandler: { (data, response, error) -> Void in guard let data = data else { return } var usedEncoding = String.Encoding.utf8 // Some fallback value if let encodingName = response?.textEncodingName { let encoding = CFStringConvertEncodingToNSStringEncoding(CFStringConvertIANACharSetNameToEncoding(encodingName as CFString)) if encoding != UInt(kCFStringEncodingInvalidId) { usedEncoding = String.Encoding(rawValue: encoding) } } if let myString = String(data: data, encoding: usedEncoding) { print("this is my string: \(myString)") } else { print("failed to decode data") } }) task.resume() 
    Intereting Posts