踩坑特殊字符之硬空格

最近处理数据的过程中,发现一个奇怪的问题,处理数据逻辑如下:有一个短字符串,我需要从一个长字符串寻找这个短字符串是否出现。这个逻辑很简单,使用任何一种编程语言,基本上都会有 包含 这种方法,直接就可以判断了,但是我遇到的情况明明就是包含了,子串就是存在,但是判断结果却不包含。另外我又直接把 2 个字符串单独取出来,肉眼去看,也是包含的。愁眉苦展之际,突然灵光闪现:会不会字符串中包含一些奇怪的特殊字符,并且肉眼难以发现。于是立马去验证一下,果然是这样,解决了我的问题,本文记录解决这个小问题的过程。

问题出现

在使用 Java 编程语言处理数据的时候,有一个字符串包含判断的逻辑,明明是包含关系,判断的结果却是不包含,代码示例如下【看下面截图,由于页面转换问题以下的代码块中丢失了这个字符】:

1
2
3
4
@Test
public void containsTest () {
System.out.println (" 每当 #每月 28 日京东企业会员日 #来临,就会有优惠 & quot;.contains ("# 每月 28 日京东企业会员日 # ".trim ()));
}

运行结果:
运行结果

尽管加上了 trim () 方法,但是返回结果仍然是 false,足以说明子串中头尾有某个符号很特殊,并没有被清除掉,所以我觉得很蹊跷。虽然在代码和截图中,那个大大的空格【其实不是空格字符】看起来很显眼,但是在实际运用中是在文本中存放的,而且不止这一个字符串,有很多,所以在检查时使用搜索替换功能【把空格替换为空白】,也是没把这个特殊符号清除掉。同时,也没有料想到文本中会出现这样特殊的符号,所以只是简单地使用 trim () 方法来清除头尾空白符【还以为生效了,其实遇到这种特殊的符号就没作用了】。

把内容复制到 Notepad++ 文本编辑器中,并且设置文本编辑器的视图显示所有的字符【会用带有颜色的特殊图标来表示文本中的特殊字符,例如肉眼看不到的字符:空格、换行等】,然后可以看到空格【橙色点点】、Tab 符号【橙色箭头】、回车换行【黑块】都会显示出来,但是唯独这个特殊字符没有显示出来,仍然是空白一片。

使用文本编辑器打开
使用文本编辑器打开

问题解决

已经知道这是个特殊字符了,下一步只要搞清楚这是个什么字符就行了,问题就会迎刃而解。

先把特殊字符复制出来,找一个转码器,把字符转为十六进制编码,看看它的编码是什么,在线编码转换工具参考:http://ctf.ssleye.com/jinzhi.html 。在 文本 这个文本框中输入特殊字符【–> <–】,然后在 十六进制 文本框中可以看到编码是 a0

可以看到十六进制的结果是 a0
转码结果

好,接下来去 Unicode 字符列表,维基百科里面的:
https://zh.wikipedia.org/wiki/Unicode% E5% AD%97% E7% AC% A6% E5%88%97% E8% A1% A8

查看这到底是个什么特殊字符。直接搜索 00A0,就可以找到,发现这是 不换行空格 ,在 拉丁字符 - 1 辅助 里面。

不换行空格
不换行空格

更进一步,我去维基百科查看这一特殊符号的介绍,发现这个符号还是挺有用的,附上链接:
https://zh.wikipedia.org/wiki/% E4% B8%8D% E6%8D% A2% E8% A1%8C% E7% A9% BA% E6% A0% BC

不换行空格介绍,一般用在网页排版中
不换行空格介绍

至此,问题原因找到了,我竟然被一个特殊符号坑了【以前也被输入法的全角、半角问题坑过】,那解决办法就很简单了,针对这种符号做替换清除就行了。

我仍在思考,这个符号是怎么被输进文本文件给我的,因为正常人通过输入法不可能打出这个符号。后来询问相关人,得知他们是从网页上直接复制的内容粘贴到文本文件中,这就可以解释了,因为这个符号就是针对网页的自动压缩空白符问题,量身定做的,怪不得。

问题总结

1、这个特殊字符【–> <–,编码 a0】有些编辑器不一定支持,会产生丢失,例如我把这条字符串内容放在了 Tower 上面的任务回复中,想记录一下,结果再复制下来就变成了空格字符,说明丢失了【并且被转为了空格字符】。但是没关系,我们记住它的 Unicode 编码就行了,找一个工具,例如:
http://ctf.ssleye.com/jinzhi.html

就可以转换了,Unicode 编码是:U+00A0,把 a0 复制到 十六进制 的文本框中,则 文本 这个文本框中出现的就是它的字符,当然,直接肉眼看不出来,要选中变为蓝色才会发现有一个字符。

编码恢复到字符
编码恢复到字符

2、以后处理字符串问题的时候,一定要区分场景,真的是自己知识面之外的情况都可能出现,而且是正常的,自己千万不要怀疑人生,而是要抽丝剥茧,一步一步找问题。

虾丸派 wechat
扫一扫添加博主,进技术交流群,共同学习进步
永不止步
0%