今天遇到一个问题,从邮箱从获取字符串形式的报文后,拿带有空格的英文船名去数据库中取数据,一直取的是空的,因为空格是不可见字符,所以开始的时候一直以为是数据库中没有数据,但是查看数据库后,发现数据库中是有数据的,所以肯定是英文船名哪里出了问题,后来将不见字符进行显示时发现,数据库中和我们平和空格键生成的空格ASCII是32,但是还有一种特殊的空格-不可间断空格的ASCII是160,这也就是我为什么一直查询为空的原因。。下边是查看字符对应ASCII值的逻辑:
final char c1 = ' '; //邮箱中英文船名的空格 final char c2 = ' '; //手动输入的空格 System.out.println((int)c1); //160 System.out.println((int)c2); //32
我们在日常使用键盘输入的空格的ASCII值是32,而这个ASCII值为160的空格,其实是不间断空格(non-breaking space),是页面上 所产生的空格。
不间断空格non-breaking space的缩写正是nbsp。这种空格的作用就是在页面换行时不被打断,如下:
页面某一行的末尾是一个英文船名为MILD CHRUOS
我们希望在换行时英文船名不会被打断,导致MILD 在第一行末尾,而CHROUS跑到第二行开头,而是保持完整的船名在同一行的末尾,于是就有了不间断空格。(在word中也有这种空格的使用)
如果使用了平常的空格,就会被页面压缩,变成下边这样:
页面某一行的末尾是英文船名MILD
CHROUS
问题
但是不间断空格有个问题,就是它无法被trim()所裁剪,也无法被正则表达式的\s所匹配,也无法被StringUtils的isBlank()所识别,也就是说,无法像裁剪寻常空格那样移除这个不间断空格。
我们可以利用不间断空格的Unicode编码来移除它,其编码为\u00A0
。
解决办法如下:
replace("\u00A0", "")
replaceAll("\\u00A0+", "") //这是正则表达式的写法
String str = "GLORY OCEAN"; //包含了不间断空格的字符串
str = str.replace("\u00A0", "");
str = str.replaceAll("\\u00A0+", "");