天天看点

字符串中的空格trim不起作用,一步debug教你直观的看到why

前提知识

  • 字符串底层是char数组 1char=2Byte=16bit
  • 字符是根据不同类型的编码映射的,类似于字典.Java默认Unicode编码
  • 在Java中你写’a’和(char)97 是一样的,不懂看看编码表

代码+原理 讲解

  1. 示例代码
    // example
    	String a ="a";
        String b =" 半角空格(普通的) 半角空格但不换行"+(char)160;
        a.concat(b);
        // 注意 trim 是不能去除后面那个空格
        b.trim();
        // 转为char数组 或者直接debug 均可看到 底层结构
        char[] chars = b.toCharArray();
        System.out.println(chars);
        System.out.println(a);
        System.out.println(b);
               

    debug截图:

    分析:在trim之后我们发现 1 处已经没有了,2 处仍旧存在,但是是我们手打的’ ‘,3 处是我们定义的(char)160,很明显.我们trim的两边的空格左边已经完成了,右边失败了.

    . . . . . 但是我们已经找到了这两个空格是不同的. 他们分别是 (char)32 和(char)160;同时得出trim也是替换的(char)32.看源码截图:

    字符串中的空格trim不起作用,一步debug教你直观的看到why
    注意:不要自作聪明 用replaceAll(’ ‘); 你这不是一样的只替换掉数组中的(char)32位置吗?要使用replaceAll((char(160)+’’));这样就行了
    字符串中的空格trim不起作用,一步debug教你直观的看到why
  2. 额外的

    . . . . 你还可以看到汉字’半’他是一个char.但是UNICODE编码.

  3. 附加常用特殊字符参考
/**普通的英文半角空格Unicode编码*/
   private static final int SPACE_32 = 32;

   /**中文全角空格Unicode编码(一个中文宽度)*/
   private static final int SPACE_12288 = 12288;

   /**普通的英文半角空格但不换行Unicode编码(==   ==   == no-break space)*/
   private static final int SPACE_160 = 160;

   /**半个中文宽度(==   == en空格)*/
   private static final int SPACE_8194 = 8194;

   /**一个中文宽度(==   == em空格)*/
   private static final int SPACE_8195 = 8195;

   /**四分之一中文宽度(四分之一em空格)*/
   private static final int SPACE_8197 = 8197;
           

继续阅读