在我的iPhone应用程序(使用SWIFT开发),我需要与一个https服务(带参数)进行通信,并且需要分析响应。所有工作都正常,但在某些情况下,我注意到它没有得到预期的结果...进一步分析后,我发现这是将服务器响应数据转换为字符串(NSData-> NSString)的问题...当我使用UTF8编码时,我得到nil作为转换后的字符串(responseString)。
我看到了其他几篇文章也在解释同样的问题...但不确定是否应该使用ASCII而不是UTF8...
此外,我无法理解回复中包含'£'符号,并且在ASCII编码下可以正常工作(即使'£'不在ASCII字符集中),但在UTF8下不能。
希望听到是否有遗漏或最佳实践...谢谢。
let responseString = NSString(data: data, encoding: NSUTF8StringEncoding)
2). 但是使用ASCII编码就没有问题了(可以获得服务器提供的正确响应)
let responseString = NSString(data: data, encoding: NSASCIIStringEncoding)
以下是我正在尝试的完整示例代码...
let myUrl = NSURL(string: "https://myurl.com/myservice.asp")
let request = NSMutableURLRequest(URL: myUrl!)
request.HTTPMethod = "POST"
request.timeoutInterval = 55.0
let postString = "paramone=\(para1)¶mtwo=\(para2)¶mthree=\(para3)"
// NOTE: Works ok with ASCII AND UTF8 both encoding types at this point...
// request.HTTPBody = postString.dataUsingEncoding(NSASCIIStringEncoding)
request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { data, response, error in
if (error != nil)
{
println("Error: \(error)")
println("Description: \(error.description)")
println("Domain : \(error.domain)")
println("Error code : \(error.code)")
}
else
{
//???? => ENCODING PROBLEM
// let responseString = NSString(data: data, encoding: NSASCIIStringEncoding)
let responseString = NSString(data: data, encoding: NSUTF8StringEncoding)
println("Response: \(responseString)")
}
}
task.resume()
我看到了其他几篇文章也在解释同样的问题...但不确定是否应该使用ASCII而不是UTF8...
此外,我无法理解回复中包含'£'符号,并且在ASCII编码下可以正常工作(即使'£'不在ASCII字符集中),但在UTF8下不能。
希望听到是否有遗漏或最佳实践...谢谢。
NSStringEncoding()
只返回零值,这不是一个有效的编码。它被视为 ASCII 编码,但可能会导致警告,如“检测到不正确的 NSStringEncoding 值 0x0000。假定为 NSASCIIStringEncoding。将在不久的将来停止此兼容性映射行为。” - Martin R