这里是我的问题:我正在开发一个包含即时聊天(使用FCM)的应用程序。一切都正常,只有在尝试发送特殊字符如“é”或表情符号时才出现问题。
收到的推送通知包含正确的字符串,但当讨论保存在服务器上并重新加载时,我无法阅读它们,并获得UTF8文本,例如“u00ea”,而不是“ê”。
我对编码等方面不是很了解,但如果您能帮忙,我将非常高兴!
这是我用来发送消息的代码:
这是我用来发送消息的代码:
func sendMessage(_ completion: @escaping (_ response: String) -> ()) {
DispatchQueue.global(qos: .userInitiated).async { () -> Void in
let urlString = //Server adress
let url = URL(string: urlString)
var request = URLRequest(url: url!)
let set = CharacterSet()
request.httpMethod = "POST"
let postString = "Message=" + /*String text to send*/
request.httpBody = postString.data(using: String.Encoding.utf8)
let task = URLSession.shared.dataTask(with: request, completionHandler: { (data, response, error) in
})
task.resume()
}
}
非常感谢!
PS:我是第一次在stackoverflow上提问,请随时要求更多细节。
根据Rob的要求进行编辑: 我发送了消息“test é è”。 另一部手机通过推送通知接收到了“test é è”。 当一部手机从存储它的服务器加载讨论时,来自服务器的答案是:
[{"content":"test u00e9 u00e8","sender":"103","timestamp":"1475491191"}]
此外,我不负责编写服务器代码,但正在负责的人同时制作了一款可以良好处理特殊字符的安卓应用。
编辑 #2:我也尝试了这段代码
var request = URLRequest(url: url!)
let set = CharacterSet()
request.httpMethod = "POST"
let postString = "Message=" + self.message.addingPercentEncoding(withAllowedCharacters: set)!
let bytesArray = UTF8Encoding.decode(postString)
request.httpBody = Data(bytes: UnsafePointer<UInt8>(bytesArray), count: bytesArray.count)
这没有任何影响。
非常感谢您的帮助。
U+00EA
是表示 "ê" 的 Unicode 代码点。但是你提供的代码看起来没问题,问题很可能出现在其他地方,比如数据在服务器上的解码、存储、加载或发送方式。你需要逐个调试每个环节!也许返回的是 JSON 数据,其中 "ê" 被编码为\u00ea
? - Martin RhttpBody
进行百分号转义。(此外,将dataTask
分派到后台队列中没有意义...它已经是异步的了。) - Robapplication/x-www-form-urlencoded
请求,如果是这样的话,他就需要对其进行百分号编码转义。或者你认为他没有使用x-www-form-urlencoded
吗? - RobNSString(data: data!, encoding: String.Encoding.utf8.rawValue) as? String
,其中data
是从URL会话接收到的数据,但是是的,就像我说的那样。 - Alexis Semmama