此空格非彼空格

 今天有碰问我一个问题:他做的是国内某手机官网,因为业务操作人员在平台录手机信息时经常会在商品编号中多添加一些空格,导致系统出现一些问题,因此他们就在存手机信息时候使用 str.replaceAll(" ", "")将空格全部替换掉,可是系统上线后业务人员反映有些信息中的空格依然没有去除,于是我那朋友再三检查,还是觉得他写的代码没问题,让他同事也帮忙看了就是不知道问题出在哪,于是江湖救急找到我,经过我排查最后解决问题,为了避免小伙伴们以后也出现类似问题不知从何下手,族长也就将问题处理方法分享出来;

问题表现为:

经过str.replaceAll(" ", "")处理完成的信息入库后,数据库依然存在空格,但是最后读到界面上的空格又显示成???这种形式了;

出现上面的问题其实是因为人们很容易走进一个误区,自认为空格只有一种,其实不然,除了我们常用的空格(unicode编码为\u0020,ASCII码 32)外还有其他类型的空格,比如:不间断空格(unicode编码为\u00A0,ASCII码 160),这种不间断空格一般出现在office办公软件中,很多业务人员录入数据的时候总是喜欢复制、粘贴,就很容易将带有不间断空格的数据复制进系统;既然这属于不同种空格,当然处理方式就不一样了;

下面是最常出现的空格unicode编码:

1.不间断空格\u00A0,主要用在office中,让一个单词在结尾处不会换行显示,快捷键ctrl+shift+space ;
2.半角空格(英文符号)\u0020,代码中常用的;
3.全角空格(中文符号)\u3000,中文文章中使用;

处理方式(处理包含以上三种空格,包括数据库中查询出ASCII码为194 160的也可以处理):

replaceAll("[\u0020\u00A0\u3000]+", "")

package com.sunfreeter.blankspace;
/**
*zhengjs
**/
public class Test {
    public static void main(String[] args) {
        //知道unicode查询字符
      System.out.println("不间断空格unicode转字符:"+Test.unicodeToString("\\u00A0")+"!");
        //知道Ascii查字符
        System.out.println("不间断空格Ascii转字符:"+Test.byteAsciiToChar(160)+"!");
        //此处为不间断空格,只需要将控制台打印的字符复制出来就可以了
        String testSpace="此处为正常空格: ,此处为不间断空格: !";

        //只会替换正常空格
        System.out.println("只会替换正常空格-----"+testSpace.replaceAll(" ", ""));
        //替换正常空格和不间断空格
        System.out.println("替换正常空格和不间断空格-----"+testSpace.replaceAll("[\u00A0\u0020]+", ""));

    }

    // 字符串转换unicode
    public static String stringToUnicode(String string) {
        StringBuffer unicode = new StringBuffer();
        for (int i = 0; i < string.length(); i++) {
            char c = string.charAt(i); // 取出每一个字符
            unicode.append("\\u" + Integer.toHexString(c));// 转换为unicode
        }
        return unicode.toString();
    }

    // unicode 转字符串
    public static String unicodeToString(String unicode) {
        StringBuffer string = new StringBuffer();
        String[] hex = unicode.split("\\\\u");
        for (int i = 1; i < hex.length; i++) {
            int data = Integer.parseInt(hex[i], 16);// 转换出每一个代码点
            string.append((char) data);// 追加成string
        }
        return string.toString();
    }


    /**
     * 将char直接转化为int,其值就是字符的ascii
     * 
     * @param ch
     * @return
     */
    public static byte charToByteAscii2(char ch) {
        byte byteAscii = (byte) ch;

        return byteAscii;
    }

    /**
     * 同理,ascii转换为char 直接int强制转换为char
     * 
     * @param ascii
     * @return
     */
    public static char byteAsciiToChar(int ascii) {
        char ch = (char) ascii;
        return ch;
    }


}
posted @ 2019-07-01 16:26  郑金圣  阅读(171)  评论(0编辑  收藏  举报