保存用户昵称到数据库发现乱码.
由于我已经设置了mysql utf8mb4,客户端传给服务器数据也已经urlencode,部分表情也是是能正常保存的,逐步排除,确认乱码的emoji是由于客户端发过来的emoji编码有问题,这些有问题的emoji是3字节,但是要知道utf-8里的emoji都是4字节,也就意味着在utf-8标准emoji里没有对应的编码,也就无法解析。
接下来的问题就变为了如何将特殊的3字节emoji转换成4字节标准emoji,幸运的是我发现将3字节emoji字符复制到pc微信客户端,能自动转换为4字节标准emoji,于是问题得到解决。
其实还有部分微信支持的emoji是没有标准utf-8编码的,因此这部分只能忽略。
因此本文的方案并不算完美。
func SpEmojiToNormalEmoji(s string) string {data := map[string]string{"%EE%80%83": "?","%EE%80%8A": "?","%EE%80%8D": "?","%EE%80%91": "✌","%EE%80%99": "?","%EE%80%9A": "?","%EE%80%9C": "⛵","%EE%80%9D": "✈","%EE%80%A1": "❗","%EE%80%A2": "❤","%EE%80%A3": "?","%EE%80%B0": "?","%EE%80%B2": "?","%EE%80%B3": "?","%EE%80%B4": "?","%EE%80%B5": "?","%EE%80%B6": "?","%EE%80%BE": "?","%EE%81%81": "?","%EE%81%86": "?","%EE%81%88": "⛄","%EE%81%89": "☁","%EE%81%8A": "☀","%EE%81%8B": "☔","%EE%81%8C": "?","%EE%81%8F": "?","%EE%81%90": "?","%EE%81%92": "?","%EE%81%93": "?","%EE%81%94": "?","%EE%81%96": "?","%EE%81%97": "?","%EE%81%99": "?","%EE%81%9A": "?","%EE%84%85": "?","%EE%84%86": "?","%EE%84%8A": "?","%EE%84%8B": "?","%EE%84%8D": "?","%EE%84%8E": "?","%EE%84%90": "?","%EE%84%93": "?","%EE%84%95": "?","%EE%84%98": "?","%EE%84%99": "?","%EE%84%9A": "?","%EE%84%9B": "?","%EE%84%9D": "?","%EE%84%AC": "〽","%EE%84%AF": "?","%EE%84%B6": "?","%EE%84%B9": "?","%EE%84%BB": "?","%EE%84%BC": "?","%EE%84%BD": "⚡","%EE%84%BE": "?","%EE%85%8C": "?","%EE%88%81": "?","%EE%88%84": "?","%EE%88%8C": "♥","%EE%88%9F": "4⃣","%EE%88%B0": "?","%EE%88%B1": "?","%EE%88%B6": "↗","%EE%88%B7": "↖","%EE%89%8E": "©","%EE%89%8F": "®","%EE%89%93": "?","%EE%8C%81": "?","%EE%8C%83": "?","%EE%8C%84": "?","%EE%8C%85": "?","%EE%8C%86": "?","%EE%8C%87": "?","%EE%8C%8D": "㊗","%EE%8C%90": "?","%EE%8C%92": "?","%EE%8C%94": "?","%EE%8C%98": "?","%EE%8C%9C": "?","%EE%8C%9D": "?","%EE%8C%A2": "?","%EE%8C%A4": "?","%EE%8C%A6": "?","%EE%8C%A7": "?","%EE%8C%A8": "?","%EE%8C%A9": "?","%EE%8C%AA": "?","%EE%8C%AB": "?","%EE%8C%AC": "?","%EE%8C%AD": "?","%EE%8C%AE": "✨","%EE%8C%AF": "⭐","%EE%8C%B0": "?","%EE%8C%B1": "?","%EE%8C%B3": "❌","%EE%8C%B5": "?","%EE%8C%BA": "?","%EE%8C%BC": "?","%EE%8D%85": "?","%EE%8D%86": "?","%EE%8D%87": "?","%EE%8D%88": "?","%EE%8D%8B": "?","%EE%90%82": "?","%EE%90%8A": "?","%EE%90%8B": "?","%EE%90%8C": "?","%EE%90%90": "?","%EE%90%92": "?","%EE%90%95": "?","%EE%90%98": "?","%EE%90%99": "?","%EE%90%9B": "?","%EE%90%9C": "?","%EE%90%9D": "?","%EE%90%9F": "?","%EE%90%A0": "?","%EE%90%A3": "?","%EE%90%A4": "?","%EE%90%A8": "?","%EE%90%A9": "?","%EE%90%B7": "?","%EE%90%B9": "?","%EE%90%BB": "?","%EE%90%BE": "?","%EE%90%BF": "?","%EE%91%84": "?","%EE%91%85": "?","%EE%91%87": "?","%EE%91%88": "?","%EE%91%89": "?","%EE%91%8A": "?","%EE%91%8C": "?","%EE%94%82": "?","%EE%94%83": "?","%EE%94%85": "?","%EE%94%93": "??","%EE%94%99": "?","%EE%94%9C": "?","%EE%94%9E": "?","%EE%94%9F": "?","%EE%94%A0": "?","%EE%94%A1": "?","%EE%94%A2": "?","%EE%94%A4": "?","%EE%94%A8": "?","%EE%94%AB": "?","%EE%94%AC": "?","%EE%94%AD": "?","%EE%94%AE": "?","%EE%94%B6": "?","%EE%A0%90": "","%EE%A0%BA": "",}s = url.QueryEscape(s)for k, v := range data {s = strings.Replace(s, k, url.QueryEscape(v), -1)}s, _ = url.QueryUnescape(s)return s}复制代码














