Commit bdee8762 authored by 技术部-任文超's avatar 技术部-任文超

解决UTF-8编码4字节的Emoji字符无法存储于Mysql的bug,问题出现范围:地址、昵称(已自测)

parent 7cd63c09
...@@ -478,12 +478,16 @@ public class InnerController implements IBaseController { ...@@ -478,12 +478,16 @@ public class InnerController implements IBaseController {
} }
addressObj.setUserId(userId); addressObj.setUserId(userId);
addressObj.setProvinceCode(provinceCode); addressObj.setProvinceCode(provinceCode);
addressObj.setProvince(province);
addressObj.setCityCode(cityCode); addressObj.setCityCode(cityCode);
addressObj.setCity(city); addressObj.setCity(city);
addressObj.setDistrictCode(districtCode); addressObj.setDistrictCode(districtCode);
addressObj.setDistrict(district); addressObj.setDistrict(district);
addressObj.setAddress(address); addressObj.setAddress(address);
addressObj.setProvince(province); if (StringUtils.isNotBlank(address)) {
// 替换所有,UTF-8编码时4字节的Emoji表情字符
addressObj.setAddress(EmojiUtil.filterUnicode4(address));
}
addressObj = addressService.save(addressObj); addressObj = addressService.save(addressObj);
LOGGER.info("保存后地址详情:{}", addressObj); LOGGER.info("保存后地址详情:{}", addressObj);
return JsonResult.buildSuccessResult(null, AddressRet.address2AddressRet(addressObj)); return JsonResult.buildSuccessResult(null, AddressRet.address2AddressRet(addressObj));
......
...@@ -238,10 +238,17 @@ public class WeChatController implements IBaseController { ...@@ -238,10 +238,17 @@ public class WeChatController implements IBaseController {
if (userInfoInDb == null) { if (userInfoInDb == null) {
// 微信用户首次登录界面, 首先保存userInfo, 跳入到微信注册登录界面 // 微信用户首次登录界面, 首先保存userInfo, 跳入到微信注册登录界面
if (StringUtils.isNotBlank(userInfo.getNickName())) { if (StringUtils.isNotBlank(userInfo.getNickName())) {
String nickName = EmojiUtil.filter(userInfo.getNickName()); // 替换所有,UTF-8编码时4字节的Emoji表情字符
String nickName = EmojiUtil.filterUnicode4(userInfo.getNickName());
userInfo.setNickName(nickName); userInfo.setNickName(nickName);
} }
userInfo = wechatService.saveWechatUserInfo(userInfo); try{
userInfo = wechatService.saveWechatUserInfo(userInfo);
}catch (Exception e){
LOGGER.warn("微信用户首次登陆,保存userInfo异常,执行操作:Nick置为*并重新保存.", e);
userInfo.setNickName(EmojiUtil.BYTE_4_REPLACE_TEMPLATE);
userInfo = wechatService.saveWechatUserInfo(userInfo);
}
redirectWechatLoginUrlWithoutLogin(response, merchant, userInfo, registerFrom, domain); redirectWechatLoginUrlWithoutLogin(response, merchant, userInfo, registerFrom, domain);
return; return;
} }
......
...@@ -6,6 +6,7 @@ import cn.quantgroup.xyqb.entity.*; ...@@ -6,6 +6,7 @@ import cn.quantgroup.xyqb.entity.*;
import cn.quantgroup.user.enums.*; import cn.quantgroup.user.enums.*;
import cn.quantgroup.xyqb.model.JsonResult; import cn.quantgroup.xyqb.model.JsonResult;
import cn.quantgroup.xyqb.service.user.*; import cn.quantgroup.xyqb.service.user.*;
import cn.quantgroup.xyqb.util.EmojiUtil;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference; import com.alibaba.fastjson.TypeReference;
import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.CollectionUtils;
...@@ -142,6 +143,10 @@ public class UserCenterController { ...@@ -142,6 +143,10 @@ public class UserCenterController {
if(null == userId || userId == 0L) { if(null == userId || userId == 0L) {
return JsonResult.buildErrorStateResult("该用户不存在", null); return JsonResult.buildErrorStateResult("该用户不存在", null);
} }
if (StringUtils.isNotBlank(nick)) {
// 替换所有,UTF-8编码时4字节的Emoji表情字符
nick = EmojiUtil.filterUnicode4(nick);
}
UserAttached userAttached = userCenterService.searchUserAttachedByUserId(userId); UserAttached userAttached = userCenterService.searchUserAttachedByUserId(userId);
if(null == userAttached) { if(null == userAttached) {
userAttached = createUserAttached(userId, "", nick); userAttached = createUserAttached(userId, "", nick);
...@@ -290,6 +295,10 @@ public class UserCenterController { ...@@ -290,6 +295,10 @@ public class UserCenterController {
addressInfo.setDistrictCode(districtCode); addressInfo.setDistrictCode(districtCode);
addressInfo.setDistrict(district); addressInfo.setDistrict(district);
addressInfo.setAddress(address); addressInfo.setAddress(address);
if (StringUtils.isNotBlank(address)) {
// 替换所有,UTF-8编码时4字节的Emoji表情字符
addressInfo.setAddress(EmojiUtil.filterUnicode4(address));
}
//更新时间 //更新时间
addressInfo.setUpdateAt(new Timestamp(System.currentTimeMillis())); addressInfo.setUpdateAt(new Timestamp(System.currentTimeMillis()));
addressService.save(addressInfo); addressService.save(addressInfo);
......
package cn.quantgroup.xyqb.util; package cn.quantgroup.xyqb.util;
import java.util.regex.Pattern; import java.util.regex.Pattern;
/** /**
* Created by 11 on 2017/2/9.
* 过滤emoji表情 * 过滤emoji表情
* @author renwc
* @date 2018-02-26
*/ */
public class EmojiUtil { public class EmojiUtil {
public static final String BYTE_4_REPLACE_TEMPLATE = "*";
/**
* Emoji表情
* 1-3字节
* [©-㊙]
*/
private static final Pattern EMOJI_USC_123 = Pattern.compile("[©-㊙]|\ufe0f");
/**
* Emoji表情
* 4字节
* [🀄-🧦]
*/
private static final Pattern EMOJI_USC_4 = Pattern.compile("[\uD83C\uDC04-\uD83E\uDDE6]");
/**
* Emoji表情
* 1-4字节
* [©-㊙]|[🀄-🧦]
*/
private static final Pattern EMOJI_USC_1234 = Pattern.compile("[\uD83C\uDC04-\uD83E\uDDE6]|[©-㊙]|\ufe0f");
private static final Pattern EMOJI = Pattern.compile("[\ud83c\udc00-\ud83c\udfff]|[\ud83d\udc00-\ud83d\udfff]|[\u2600-\u27ff]"); /**
* 替换所有Emoji表情字符
* @param text
* @return
*/
public static String filterUnicode1234(String text) {
return text == null || text.trim().isEmpty() ? text : EMOJI_USC_1234.matcher(text).replaceAll("");
}
public static String filter(String str) { /**
return str == null || str.trim().isEmpty() ? str : EMOJI.matcher(str).replaceAll(""); * 替换所有Emoji表情字符
* 条件:UTF-8编码时4字节的
* @param text
* @return
*/
public static String filterUnicode4(String text) {
return text == null || text.trim().isEmpty() ? text : EMOJI_USC_4.matcher(text).replaceAll(BYTE_4_REPLACE_TEMPLATE);
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment