问题:
在开发中遇到字符串需要去除 文本中间的空格,用了,正则 \s*,repaleAll(" “,”"),都没用。在开发工具本地运行repaleAll(" “,”") 可以去除空格,只要经过网络传输就无法去除空格。
查找原因
本地运行方法
public void test05(){
String world ="你 好";
String trim = world.replace(" ","");
System.out.println(trim);
}
正常 输出:

经过网络传输后的现象
发现空白部分并没有去除,还是存在。
接着尝试将文本输出到控制台,发现空白部分乱码。
看到这个结果就怀疑在 网络处理、或前端传输过程中将字符串编码了。
尝试获空白部分的 ASCII编码
/**
* 获取ASCII码
* @param value
* @return
*/
public static String stringToAscii(String value)
{
StringBuffer sbu = new StringBuffer();
char[] chars = value.toCharArray();
for (int i = 0; i < chars.length; i++) {
if(i != chars.length - 1)
{
sbu.append((int)chars[i]).append(",");
}
else {
sbu.append((int)chars[i]);
}
}
return sbu.toString();
}
输出 字符编码 :
20320,160,160,160,160,160,22909
20320 ,22909 对照 UTF-8是 是 “你好“”
160 对照 ASCII 却没有查到 。
查阅多篇资料后发现 ASCII 中160是后续补充的。
平时我们用键盘输入的空格的ASCII值是32,而这个ASCII值为160的空格,其实是不间断空格(non-breaking space)
我们可以利用不间断空格的Unicode编码来移除它,其编码为\u00A0
replace("\u00A0", "")
replaceAll("\\u00A0+", "") //这是正则表达式的写法
String str = "aacsdfe "; //包含了不间断空格的字符串
str = str.replace("\u00A0", "");
str = str.replaceAll("\\u00A0+", "");
解决方案
最后调用:
参考博主文章: 特殊的空格-ASCII码值160