最近线上出现一个问题,前后端交互时,某些情况下,会有中文乱码的问题。
解决思路:
1. 在后端先将中文转为 Base64 后再传递到前端(此中文在前端不做显示处理)。
2. 前端将参数再传递回后端时,后端解析 Base64 得到中文字符串。
- package gov.zhbs.utils;
-
- import org.apache.axiom.util.base64.Base64Utils;
- import org.apache.commons.lang3.StringUtils;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
-
- import java.nio.charset.StandardCharsets;
- import java.util.regex.Pattern;
-
- /**
- *
- *
- *
- *
- * Copyright:.All rights reserved.
- *
- *
- * Company:Zsoft
- *
- *
- * CreateDate: 2022-08-16
- *
- *
- * @author YuGongWen
- * @history Mender: YuGongWen;Date: 2022-08-16;
- */
- public class MyBase64Utils {
-
- private static Logger logger = LoggerFactory.getLogger(MyBase64Utils.class);
-
- /**
- * 获取字符串的 Base64 字符串
- *
- * @param inputStr
- * @return
- */
- public static String getBase64Str(String inputStr) {
- if (StringUtils.isBlank(inputStr)) {
- return inputStr;
- }
- String base64Str = Base64Utils.encode(inputStr.getBytes(StandardCharsets.UTF_8));
- return base64Str;
- }
-
-
- /**
- * 解码 Base64 字符串
- *
- * @param base64Str
- * @return
- */
- public static String getStrByBase64(String base64Str) {
- if (StringUtils.isBlank(base64Str)) {
- return base64Str;
- }
-
- if (MyBase64Utils.ifBase64Str(base64Str)) {
- // nothing to do
- } else {
- // 非 Base64 格式,不做处理,直接返回
- return base64Str;
- }
- byte[] decode = Base64Utils.decode(base64Str);
- return new String(decode, StandardCharsets.UTF_8);
- }
-
- /**
- * 判断字符串是否为 Base64 格式
- *
- * @param str
- * @return
- */
- public static boolean ifBase64Str(String str) {
- if (StringUtils.isBlank(str)) {
- return false;
- }
- String pattern = "^([A-Za-z0-9+/])*([A-Za-z0-9+/]|[A-Za-z0-9+/]=|[A-Za-z0-9+/])$";
- if (Pattern.matches(pattern, str)) {
- return true;
- } else {
- return false;
- }
- }
-
- }