1、起因
今天在解析RSS的Feed的时候,由于需求是需要去掉html标签,仅保留其文本信息。结果在解析某博客的时候发现,解析后的文本信息中前后含有空格,但是在代码已经使用正则表达式替换掉了\t\r\n\f了,并且也使用了trim操作,可怎么还是还是有空格呢?
2、分析
使用了各种正则表达式来进行替换,结果还是有空格,最后没有办法,查看了这些空格的二进制代码,发现这些空格是0xE38080,这跟平常我们的空格是不一样的0x20,怪不得去不掉这个空格呢。可怎么去掉这种空格呢?有人说使用\f(分页符)可以替换掉,有人说使用正则表达式可以替换掉,结果都没有成功(可能是我使用的不对),最后发现使用apache-common的StringUtils.strim()可以去掉,读了一下源代码发现,StringUtils.strim()去空格使用的Character.isSpaceChar()来进行判断的,如果该判断返回为true,则去掉。
3、总结
但是为什么String.trim()去不掉空格呢?读了一些这个源代码,发现这个方法去掉的空格都是ASCII码控制下的一些非可见字符,像0xE38080这种空格是在范围外的,所以去除不掉。关于去除空格的问题,网络上多有讨论,其实大多数都是要求覆盖到尽可能多的空格字符。
4、扩展
作为扩展,查了一下空格的定义,不看不知道,一看才知道,原来空格的定义是很宽泛的(参见维基百科中的“空格”http://zh.wikipedia.org/zh-cn/%E7%A9%BA%E6%A0%BC)。其中我们讨论到的0xE38080是一种表意文字空格。一般我们所说的空格包括了以下几个部分:空白字符包括 "空格" (U+0020), "制表符" (U+0009), "换行" (U+000A), "回车" (U+000D), 及 "换页" (U+000C)。其他看似空白的字符,例如 "em-space" (U+2003) 及 "ideographic space" (U+3000,表意空格) 不是空白的一部分,注意是看似空白的。