保存用户昵称到数据库发现乱码.
由于我已经设置了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
}
复制代码