java处理表单提交特殊字符'\u202D'

最近两天运营说录入电话号码老是报格式不正确错误,但是电话明明是正常的,我跑去他那里仔细看了看所有的参数都是正常:

 

找了很久都没有找到原因,参数明明没有问题。细问是怎么操作的,说是从Excel中复制过来的,于是便怀疑在复制的时候复制了多余的东西。于是试了手写是正常,mac电脑复制过来是正常,windows有些版本的Excel复制过来就有问题。本地一调试发现,果不其然,正常手写的手机号是11位,但是复制过来的确是多了一个东西,长度变为了12位,多了个'\u202D',问题找到了。

搜了一下,网上也有好多同学遇到过这个问题,于是写了个工具类,去掉其中的多余字符,问题就解决了:

package com.lianj.crm.modules.sys.utils;

import com.lianj.crm.common.utils.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.regex.Pattern;

/**
 * 电话工具类
 *
 * @author xiaowei
 * @date 2019年8月21日
 */
public class PhoneUtils {

    private static Logger logger = LoggerFactory.getLogger(PhoneUtils.class);

    /**
     * 电话校验,先处理特殊字符后校验
     * @param str
     * @return
     */
    public static boolean checkPhone(String str) {
        if (StringUtils.isNotBlank(str)) {
            dealPhoneNumber(str);// 先进行特殊字符处理
            String expression = "^[1][3,4,5,6,7,8,9][0-9]{9}$";
            Pattern pattern = Pattern.compile(expression);
            return pattern.matcher(str).matches();
        }
        return false;
    }

    /**
     * 处理电话特殊字符问题
     *
     * @param phone
     * @return
     */
    public static String dealPhoneNumber(String phone) {
        if (StringUtils.isNotBlank(phone)) {
            phone = removeNonAscii(phone);
            phone = removeSomeControlChar(phone);
            phone = removeFullControlChar(phone).trim();
            return digitFileter(phone);
        }
        return null;
    }

    /**
     * 数字过滤
     *
     * @param str
     * @return
     */
    public static String digitFileter(String str) {
        if (StringUtils.isNotBlank(str)) {
            char[] num = str.trim().toCharArray();
            char[] arr = new char[num.length];
            int j = 0;
            for (int i = 0; i < num.length; i++) {
                if (Character.isDigit(num[i])) {
                    arr[j] = num[i];
                    j++;
                }
            }
            return String.valueOf(arr).trim();
        }
        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]", "");
    }

    public static void main(String[] args) {
        String phone = "198345688882";
        System.out.println(checkPhone(phone));
    }

}

 

总结:

'\u202D'应该是属于不可打印字符,因此不能正常显示出来,但是确实占了字符串位数,所以导致错误。mark一下,希望能帮到遇到同样错误的同学。

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值