隐藏字符导致的查询失败

问题现象:

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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值