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