在项目中遇到特殊的空格--ASCII码值160

今天遇到一个问题,从邮箱从获取字符串形式的报文后,拿带有空格的英文船名去数据库中取数据,一直取的是空的,因为空格是不可见字符,所以开始的时候一直以为是数据库中没有数据,但是查看数据库后,发现数据库中是有数据的,所以肯定是英文船名哪里出了问题,后来将不见字符进行显示时发现,数据库中和我们平和空格键生成的空格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+", "");

猜你喜欢

转载自blog.csdn.net/JSUITDLWXL/article/details/130029610