谁动了我的 RSS

in 技术 with 10 comments

事实上,我的 RSS 在过去一年都是不可用的。

我平常使用 Mac 平台的 Reeder 作为 RSS 阅读器。起初朋友告诉我,我博客的 RSS 在 Reeder 中无法被添加。即使是订阅过我博客的读者,也无法正常获取到博文更新。我试了试,确实如此,但我博客的 Feed 页面是确实存在的。这个问题把我搞得一头雾水,一度认为是 Reeder 的 BUG,还曾写 E-mail 询问过官方,但未得到回复。

前一阵子强迫症发作,花了一个下午排查此事,终于被我发现了问题所在:博文中含有「退格符」这个控制字符,导致 RSS 解析失败。

这 TM 藏得也太深了!

什么是控制字符?

引自 Wikipedia

控制字符,是出现在特定的信息文本中,表示某一控制功能的字符。
在计算中,一个控制字符或非打印字符,是一个码位(一个数字)是否在字符集,其自身也是书写字母来描述的。
ASCII中常用的控制字符包括:
7(bell响铃),用来使收到该字符的设备发出某种警告
8(backspace退格),用来删除或者叠打上一个被打印的字符
9(horizontal tab水平制表)
10(line feed馈行),在大多数UNIX系统和变异系统中用来结束行
12(form feed馈页),用来使打印机馈出一页
13(carriage return归位),在Mac OS、OS-9、FLEX和CP/M-80派生的系统中,包括DOS,用于结束文本行
27(escape转义)

博文中为什么会出现控制字符?

我习惯使用博客后台的 Markdown 编辑器写作,当然,这个问题和 Markdown 无关。

这其实是 Chromium 的一个 BUG,当你使用「MacOS + Chrome + 中文输入法」的时候,使用退格键时就很容易产生隐藏的「退格符」,在普通的编辑器中是看不到的。

作为知名的编辑器, VScode 在开启了 Preview tab 或者任意的 Webview tab(比如起始页) 时,也会出现这个问题。因为 VScode 的底层是 Electron,而 Electron 的底层正是 Chromium。

因为博文中带有退格符,输出的 RSS 同样也会有,因为控制字符无法被正确解析,就导致了 RSS 不可用的问题。

如何复现:

在使用 Chrome 中的网页编辑器或者使用带 Webview 的 VScode 时,使用中文输入法输入中文,一直按后退键,例如输入sfsf,当你按了4下后退键时,你会发现,搜狗输入法弹出框虽然消失了,但是页面上还会剩下一个s,
这是你如何再次按一下后退的话,s 就会变成 bs, 变成隐藏的退格符。

2017-08-08-031516.jpg

(Sublime 中可以正常显示出退格符,即那个”BS“)

退格符在浏览器里完全看不到,我在查博文数据库时,也没有发现,直至我将某几篇博文复制到 Sublime 里,退格符才「现出真身」。

如何解决

首先写一条 SQL 批量过滤博文中的退格符(其实只有三处,但很致命)。替换完毕后,RSS 输出就完全没问题了,博客的 RSS 终于变正常了。

为了防止以后出现这种问题,我尽量不用在线编辑器了,或者发布前先自检一下是否含有控制字符。再或者,写个 Typecho 插件对发布的博文进行控制字符过滤,鉴于我比较懒,就不写了。

参考资料

Mac 上的 VSCode 编写 Markdown 总是出现隐藏字符? - 知乎
vscode控制字符引起的问题以及解决思路 - 前端 - 掘金

Responses
选择表情选择表情
  1. 我记得我的RSS输出也是这个问题,后来用notepad++编辑另存为无BOM模式,就正常了。

    Reply
  2. 这个bug确实很难发现

    Reply
  3. 来看看,网站样式换的不错,觉得很赞

    Reply
  4. 我用的 tiny tiny rss + Reeder,一直很正常

    Reply
    1. @DIYgod

      wow,我也要自建一个了。 icon_arrow.gif

      Reply
  5. 有一年了吗??没觉得诶。

    Reply
    1. @大致

      你是用 Feedly 吗,有的阅读器解析起来好像没问题。

      Reply
      1. @大袋鼠

        inoreader,大多数时候用网页版。

        Reply
  6. 以前也发生过,不过很久没发生了啊。
    Mojave+Chrome70.0

    Reply
    1. @老虎

      我前几天刚升的 Mojave,刚测试了下,问题还是存在的。

      Reply