问题现象:
A服务查询数据库找到activityNo字段,作为查询B服务信息的一个参数,传递给B服务,B服务提示查询不到,但实际B服务数据库中存在对应数据
对比日志:
无法查询到数据的参数:(关键字:activity_no)
可以查询到数据的参数:(关键字:activity_no)
数据库中对应数据:
问题结果:
0宽度隐藏字符导致,将日志数据copy到IDEA中可得如下结果
且数据库通过Length函数可以得到无法查询到数据的参数长度比可以查询到数据的参数更长(实际都是20位数字)
解决方案:
通过java trim()函数去除两侧空格占位符,同时通过正则表达式去除特殊字符,避免出现类似问题
字符处理工具类:
package org.jeecg.modules.system.util;
import org.apache.commons.lang.StringUtils;
/**
* 字符处理工具类
* @author Administrator
*/
public class StringDealUtils {
/**
* 处理特殊字符问题
*
* @param phone
* @return
*/
public static String dealBlankString(String phone) {
if (StringUtils.isNotBlank(phone)) {
phone = removeNonAscii(phone);
phone = removeSomeControlChar(phone);
phone = removeFullControlChar(phone).trim();
return phone;
}
return null;
}
/**
* 去除非ascii码字符
*
* @param str
* @return
*/
public static String removeNonAscii(String str) {
return str.replaceAll("[^\\x00-\\x7F]", "");
}
/**
* 去除不可打印字符包含零宽度的特殊字符
*
* @param str
* @return
*/
public static String removeNonPrintable(String str) {
return str.replaceAll("[\\p{C}]", "");
}
/**
* 去除一些控制字符 Control Char
*
* @param str
* @return
*/
public static String removeSomeControlChar(String str) {
return str.replaceAll("[\\p{Cntrl}\\p{Cc}\\p{Cf}\\p{Co}\\p{Cn}]", ""); // Some Control Char
}
/**
* 去除一些换行制表符
*
* @param str
* @return
*/
public static String removeFullControlChar(String str) {
return removeNonPrintable(str).replaceAll("[\\r\\n\\t]", "");
}
}
// 原文:3个字,有0宽度特殊字符展示如下
String text = "\u202D3个字\u202C";
String s = StringDealUtils.removeNonPrintable(text);