微信小程序用户昵称emoji乱码问题

2,428 阅读3分钟

保存用户昵称到数据库发现乱码.

由于我已经设置了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
}