---
title: 原来还有一种空格叫 "NBSP"
date: 2018-03-04T11:36:00+08:00
tags:
  - Web
  - 技术

---

最近在用 Node 的 cheerio 类库整一个抓取课表的小爬虫，其中有部分不需要的信息的 HTML 标签内部只有一个 `&nbsp;`，我想利用它作为特征来过滤掉无用的信息。

cheerio 默认会把所有HTML字符都转换为相应的实体(HTML Entity), 所以我设置了一个

```
cheerio.load(data, { decodeEntities: false });
```

的选项，把它们都还原为原本的字符。

没想到又打开了一个新坑。。。

起初的过滤代码是这样的

```
// 遍历单元格
var courses = courseCells.filter(function (i, el) {
  var html = $(el).html();
  return html !== " ";
});
```

然后惊奇地发现，居然没有过滤成功？？？

加了句 `console.log(html !== " ")`，发现结果都是 `true`

所以这里的`html`里面的 `&nbsp;` 和 `" "` 不是一个东西？

用 `console.log(encodeURIComponent(html))`，发现结果是

```
%C2%A0
```

一般的空格不是 `%20` 吗，果然它们不是一个东西。

搜索发现，这玩意儿原来叫 Non-breaking space，ASCII码是 `160`，用来防止两个连着的单词因为自动换行而拆散。

知道了问题所在，一切都变得简单了～

```
// 遍历单元格
var courses = courseCells.filter(function (i, el) {
  var html = $(el).html();
  return html !== String.fromCharCode(160);
});
```

参考：[Non-breaking space - Wikipedia](https://en.wikipedia.org/wiki/Non-breaking_space)
