mysql保存emoji报java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x8B'

最近在做即时聊天功能,需要支持 emoji 表情,测试直接发送时后台 mysql 数据库会报类似 java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x8B' 这样的错误。

原因:

由于 emoji 是 utf-16 编码,占四个字节,而 mysql 是 utf-8,正常汉字不会超过三个字节

解决:

将 四字节 utf-16 的 emoji 转换成字符串存到数据库中,显示的时候再将字符串转换成 四字节的 utf-16

// 将 emoji 表情转换为字符串
function utf16toEntities(str) {
				var patt=/[\ud800-\udbff][\udc00-\udfff]/g; // 检测utf16字符正则
				str = str.replace(patt, function(char){
					var H, L, code;
					if (char.length===2) {
						H = char.charCodeAt(0); // 取出高位
						L = char.charCodeAt(1); // 取出低位
						code = (H - 0xD800) * 0x400 + 0x10000 + L - 0xDC00; // 转换算法
						return "&#" + code + ";";
					} else {
						return char;
					}
				});
				return str;
			}

// 将字符串转换为 emoji 表情
function uncodeUtf16(str){
				var reg = /\&#.*?;/g;
				var result = str.replace(reg,function(char){
					var H,L,code;
					if(char.length == 9 ){
						code = parseInt(char.match(/[0-9]+/g));
						H = Math.floor((code-0x10000) / 0x400)+0xD800;
						L = (code - 0x10000) % 0x400 + 0xDC00;
						return unescape("%u"+H.toString(16)+"%u"+L.toString(16));
					}else{
						return char;
					}
				});
				return result;
			}

参考:https://blog.csdn.net/dingsai88/article/details/79299232

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值