问题:
在开发中遇到字符串需要去除 文本中间的空格,用了,正则 \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
解决字符串中不间断空格( )的去除问题
本文介绍了在开发过程中遇到的字符串空格去除难题,特别是针对ASCII值160的不间断空格。通过分析发现,常规的空格替换方法无效,因为该空格实际上是不间断空格( )。通过使用Unicode编码的替换方法,成功解决了在网络传输后空格无法去除的问题。同时,提供了获取字符ASCII编码的辅助方法,并给出了最终的解决方案。
9222

被折叠的 条评论
为什么被折叠?



