Swift - 特殊字符的编码和解码字符串

2024-04-10

这是我的问题:我目前正在开发一个应用程序,包括即时聊天(使用 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 提问,所以请毫不犹豫地询问更多详细信息

按照罗布的要求进行编辑: 我发送了消息“testéè”。
另一部手机通过推送通知收到“test é è”。
当一部电话从存储了服务器答案的服务器加载讨论时。

    [{"content":"test u00e9 u00e8","sender":"103","timestamp":"1475491191"}]

另外,我没有对服务器进行编码,但那个人也在制作一个 Android 应用程序,它可以很好地处理特殊字符。

Edit #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)

这没有任何区别。

非常感谢你们的帮助。


你想使用addingPercentEncoding以百分比转义字符串。但不要试图使用像这样的字符集urlQueryAllowed,因为这会让一些关键人物(特别是& and +) 未转义。

作为如何正确执行此操作的一个很好的示例,请参阅 Alamofire 的参数编码 https://github.com/Alamofire/Alamofire/blob/master/Source/ParameterEncoding.swift escape常规。这是作为扩展实现的再现:

extension String {
    public func addingPercentEncodingForQueryParameter() -> String? {
        return addingPercentEncoding(withAllowedCharacters: .urlQueryValueAllowed)
    }
}

extension CharacterSet {
    static let urlQueryValueAllowed: CharacterSet = {
        let generalDelimitersToEncode = ":#[]@" // does not include "?" or "/" due to RFC 3986 - Section 3.4
        let subDelimitersToEncode = "!$&'()*+,;="

        var allowed = CharacterSet.urlQueryAllowed
        allowed.remove(charactersIn: generalDelimitersToEncode + subDelimitersToEncode)

        return allowed
    }()
}

然后你可以做类似的事情:

func send(message: String, _ completion: @escaping (_ response: String) -> ()) {
    let urlString = ...
    let url = URL(string: urlString)

    var request = URLRequest(url: url!)
    request.httpMethod = "POST"
    request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
    let postString = "Message=\(message.addingPercentEncodingForQueryParameter()!)"
    request.httpBody = postString.data(using: .utf8)

    let task = URLSession.shared.dataTask(with: request) { data, response, error in
        ...
    }
    task.resume()
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift - 特殊字符的编码和解码字符串 的相关文章

随机推荐