自己开发的一个搜索引擎中,发现两个奇怪现象:
1. 将数据dump成文本,在vim中打开,发现有<200b>特殊字符
2. 引擎中做了空格归并,但dump出的结果中却还是有多处连续空格
对于问题一,发现<200b>是一种叫『ZERO WIDTH SPACE』的东东,用于将文本隔开,但是看起来又是一个整体,这带来一个好处是,一段连续的汉字,当我们双击某个字时,会自动选择是一个词,而不是整段文字。
类似的特殊字符还有:
落在如下范围内:
而遇到的问题2则更有趣的,是所谓的『Non-breaking space』,正好跟上面的情况相反,上面是说有些尽管显示在一起的字符,其实是应该拆开,而Non-breaking space表示,有些尽管显示不在一起的字符,却应该看成一个整体。多种情况会出现这样的需求,比如『距离为100 km』,这里的『100』和『km』之间有空格,但是却希望他俩成为一个整体,不应该在折行时,『100』在上一行,而『km』在下一行,再比如说一些国家的人名或者地名,比如『v. l. n. r』,尽管显示上有空格,再是却希望被看成一个整体。
问题2中便是由于空格和这种特殊的空格交织了在一起,导致空格归并时没能正确处理。编码为:
Non-breaking space | 编码 |
UTF-8 | \xc2\xa0 |
Unicode | U+00A0 |
引擎存储使用UTF8还是GBK是一个纠结的问题,UTF8浪费空间,乱七八糟的东西多,但是显示时方便,GBK节省空间,就是中文比较纯粹,但是显示时要转换,字符匹配算法也不能随便用,半字检查也比较麻烦。