今天接手了一个项目,里面有个功能点是点赞评论的功能,之前写的代码用户输入表情符号后我们返显出来的是一堆???问号
- 大概原因:UTF-8编码有可能是两个、三个、四个字节。Emoji表情是4个字节,而Mysql的utf8编码最多3个字节,所以数据插不进去,识别不出来就成了一堆???。
- 解决方案:先把用户选择的表情符号用charCodeAt给转成编码,取数据时再解码成16进制的就好了。
这里直接封装好的两个js方法,粘贴复制直接调用就行
//编码:
emojiEncode(e) {
var n = /[\ud800-\udbff][\udc00-\udfff]/g;
// 检测utf16字符正则
return e = e.replace(n, function(e) {
var n, r;
return 2 === e.length ? (n = e.charCodeAt(0), r = e.charCodeAt(1),
"&#" + (1024 * (n - 55296) + 65536 + r - 56320) + ";") : e
})
},
//解码:
emojiDecode(e) {
var n = /\&#.*?;/g; //获取数据库种16进制的数据
//然后进行解码操作
return e.replace(n, function(e) {
var n, r, t;
return 9 == e.length ? (t = parseInt(e.match(/[0-9]+/g)), n = Math.floor((t - 65536) / 1024) + 55296, r = (t - 65536) % 1024 + 56320, unescape("%u" + n.toString(16) + "%u" + r.toString(16))) : e
})
},
//我们输入了评论内容把内容进行编码
var data = {
token: App.getP('token'),
family_content_id: App.getP('family_content_id'),
comment_message: this.emojiEncode(this.commentMessage)
}
//获取数据后在解码
content: {
text: that.emojiDecode(that.commentMessage),
date: "刚刚"
},
end~~~
如有错误或观点不一致的请评论留言共同讨论,本人前端小白一枚,根据自己实际项目遇到的问题进行总结分享,谢谢大家的阅读!
文章对您有所帮助请给作者点个赞支持下,谢谢~