Alamofire 4和JSON中的特殊字符
Alamofire 4有特殊字符的问题。
JSON包含æ,ø和å,浏览器可以很好地显示它们,我之前使用SwiftyJSON的解决scheme也是如此。
Alamofire 4展示了这样的东西:
U00e6
使用此调用:
Alamofire.request(specificURL, method: .get, parameters: param, encoding: URLEncoding.default, headers: nil).responseJSON { (response: DataResponse<Any>) in print(response) }
该怎么做才能解决这个问题?
编辑:
Alamofire.request(url, method: .get, parameters: param, encoding: JSONEncoding.default) .responseJSON { response in switch response.result { case .success(let value) : print(response.request) // original URL request print(response.response) // HTTP URL response print(response.data) // server data print(response.result) // result of response serialization if let JSON = response.result.value as! [String:AnyObject]!{ print("JSON: ",JSON) self.arrUser = Mapper<Users>().mapArray(JSONArray:JSON["user"] as! [[String : Any]])! self.tableView.reloadData() } case .failure(let encodingError): //Print error } }
我得到了在json响应中添加了æ的问题并尝试打印。
输出:
JSON: Optional(<__NSArrayI 0x600000050320>( { "email_address" = "testwts06@gmail.com"; username = "testwts06 \U00e6"; }, { "email_address" = "testwts01@gmail.com"; username = "testwts01 \U00eb"; }, { "email_address" = "testwts100@gmail.com"; username = testwts100; })
显示时显示格式正确。
Ekta的答案Swift 3更新:
let encodedURL = specificURL.addingPercentEncoding(withAllowedCharacters: NSCharacterSet.urlQueryAllowed)
由于错误的JSON编码看起来典型的序列化错误,可能你的响应状态码是3840。
JSON文本应以UTF-8,UTF-16或UTF-32编码。
您可以尝试将响应数据转换为正确的UTF8编码:
let datastring = NSString(data: response.data!, encoding: String.Encoding.isoLatin1.rawValue) let data = datastring!.data(using: String.Encoding.utf8.rawValue) do { let object = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) let jsonDic = object as! NSDictionary print(" ok, successfully converted..\(jsonDic)") } catch let aError as Error { // print and handle aError }
希望它可以帮助你。
这是一个简单的String
扩展,解决了这个问题:
extension String { func fixUnicode() -> String { var copy = self as NSString let regex = try! NSRegularExpression(pattern: "\\\\U([A-Z0-9]{4})", options: .caseInsensitive) let matches = regex.matches(in: self, options: [], range: NSMakeRange(0, characters.count)).reversed() matches.forEach { let char = copy.substring(with: $0.rangeAt(1)) copy = copy.replacingCharacters(in: $0.range, with: String(UnicodeScalar(Int(char, radix: 16)!)!)) as NSString } return copy as String } }