文章插图
背景在 linux 下手写一个命令和拷贝 html 页面文本域中的命令执行结果完全不同,后者的命令无法被 Linux 识别 。
问题截图
文章插图
肉眼看不到的区别
肉眼根本看不出来这两行有什么区别,但执行结果就是有问题 。
问题定位编写测试代码,执行两个字符串的 equals 方法,输出结果是 false 。逐个输出对应字符的 ASCII 值,发现一个 echo 命令后的空格,一个是 32,另一个是 160 。而 160 那个空格来自页面文本域的拷贝值 。
网络搜索果然有关于这两个空格的坑,160 这个空格是是由页面上的 产生的空格,全称为“non-breaking space”,其 UTF-8 编码值为 u00A0 。
解决办法,将页面表单中的 160 空格替换为普通空格:
【ASCII 码不同的两种空格及潜在问题:32 和160】
String s11 = "mem_status=`free -m|sed -n '2p'|sed -E 's/ +/ /g'`;mem_total=`echo $mem_status|cut -d \" \" -f 2`;mem_used=`echo $mem_status|cut -d \" \" -f 3`;mem_usedpercent=`echo \"scale=2;$mem_used*100/$mem_total\" | bc | awk '{printf "%.2f", $0}'`;echo $mem_usedpercent";String s22 = "mem_status=`free -m|sed -n '2p'|sed -E 's/ +/ /g'`;mem_total=`echo $mem_status|cut -d \" \" -f 2`;mem_used=`echo $mem_status|cut -d \" \" -f 3`;mem_usedpercent=`echo \"scale=2;$mem_used*100/$mem_total\" | bc | awk '{printf "%.2f", $0}'`;echo $mem_usedpercent";System.out.println("s1=s2:"+s11.equals(s22));s22 = s22.replaceAll("\u00A0+", " ");s11 = s11.replaceAll("\u00A0+", " ");System.out.println("s1=s2:"+s11.equals(s22));
就是一个简单的获取 Linux 操作系统的磁盘使用百分比的命令集 。替换后两字符串的 equals 返回真,执行结果:
s1=s2:falses1=s2:true
推荐阅读
- Google 官方Java 编码规范
- 一行代码让你的python运行速度提高100倍
- 6行代码实现下载一首网易云歌曲
- 如何用阿里云号码认证服务
- Linux和Windows两种风格的操作系统,创建线程的方式有何不同?
- 曹操在官渡之战和赤壁之战中的不同结局给我们什么启示 官渡之战曹操胜,赤壁之战曹操败,启示
- 微信小程序里长按识别二维码
- C++11/14/17标准库测试代码
- 如何利用Java代码操作索引库?
- 虚拟机XP忘记用户密码,一招搞定