swift nsurlrequest

swift - ¿Por qué mi devolución es nula pero si presiono la URL en Chrome/Safari, puedo obtener datos?



nsurlrequest (2)

@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() }

Estoy usando la url anterior para intentar obtener algunos datos, pero el retorno es nulo, pero ingreso la url en chrome / safari, puedo obtener algunos datos. Realmente no sé por qué, ¿alguien puede ayudar a explicar?


El texto que intenta obtener probablemente no sea UTF-8, intente con otra codificación, como esta, por ejemplo:

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

Actualización: lea la respuesta de Martin R sobre cómo encontrar la codificación correcta.


Este servidor HTTP envía un

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

campo de encabezado en la respuesta, por lo tanto, obtiene la codificación correcta de la propiedad textEncodingName de NSURLResponse . Esto se puede convertir a NSStringEncoding .

Esto es solo una traducción de la solución presentada en https://.com/a/19885463/1187415 a Swift, más algunas comprobaciones de errores simples:

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()

Salida:

this is my string: var hq_str_sz000609="绵世股份, ....

Se necesitan cambios menores para 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()

Actualización para 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()