当结果内容包含重音字符(例如ñ
或é
)时,我无法使用API调用的结果。
以下是我使用的代码:
let url = "http://example.com/fetchdata.php"
let request = NSMutableURLRequest(URL: NSURL(string: url)!)
request.addValue("gzip", forHTTPHeaderField: "Accept-Encoding")
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")
request.HTTPMethod = "POST"
let params = ["country":selectedCountry] as Dictionary<String, AnyObject>
request.HTTPBody = try? NSJSONSerialization.dataWithJSONObject(params, options: [])
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in
if let d = data {
let json = try? NSJSONSerialization.JSONObjectWithData(d, options: .AllowFragments) as! [Dictionary<String, String>]
// do some work on the resulting json object
// This is where the trouble starts!
}
})
如果结果只包含普通的非重音字符,则一切正常,否则将json
对象强制转换为[Dictionary<String, String>]
会失败。如果我跑
print(try? NSJSONSerialization.JSONObjectWithData(d, options: .AllowFragments))
它将数组中的违规字段显示为"<null>"
。
我甚至没有将我从服务器获得的数据转换为String
,因此我不确定在哪里可以强制它使用UTF8编码,如果它&#39 ;现在不这样做。我该如何解决?
修改 实际上,这结果是一个服务器问题。在php脚本中指定charset就可以了:
$db->set_charset("utf8");
奇怪的是,当数据使用一组相同配置的自定义php脚本进出数据库时,这不是必需的,但是一旦使用phpMyAdmin的导入功能添加数据就会破坏。