事实上,我的 RSS 在过去一年都是不可用的。
我平常使用 Mac 平台的 Reeder 作为 RSS 阅读器。起初朋友告诉我,我博客的 RSS 在 Reeder 中无法被添加。即使是订阅过我博客的读者,也无法正常获取到博文更新。我试了试,确实如此,但我博客的 Feed 页面是确实存在的。这个问题把我搞得一头雾水,一度认为是 Reeder 的 BUG,还曾写 E-mail 询问过官方,但未得到回复。
前一阵子强迫症发作,花了一个下午排查此事,终于被我发现了问题所在:博文中含有「退格符」这个控制字符,导致 RSS 解析失败。
什么是控制字符?
控制字符,是出现在特定的信息文本中,表示某一控制功能的字符。
在计算中,一个控制字符或非打印字符,是一个码位(一个数字)是否在字符集,其自身也是书写字母来描述的。
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, 变成隐藏的退格符。
退格符在浏览器里完全看不到,我在查博文数据库时,也没有发现,直至我将某几篇博文复制到 Sublime 里,退格符才「现出真身」。
如何解决
首先写一条 SQL 批量过滤博文中的退格符(其实只有三处,但很致命)。替换完毕后,RSS 输出就完全没问题了,博客的 RSS 终于变正常了。
为了防止以后出现这种问题,我尽量不用在线编辑器了,或者发布前先自检一下是否含有控制字符。再或者,写个 Typecho 插件对发布的博文进行控制字符过滤,鉴于我比较懒,就不写了。
参考资料
Mac 上的 VSCode 编写 Markdown 总是出现隐藏字符? - 知乎
vscode控制字符引起的问题以及解决思路 - 前端 - 掘金
就喜欢这种解决实际问题的文章分享
这个文章很有价值,我收藏的近二百多个博客,有些虽然有RSS,但是就是订阅不了!
能否提供一下 SQL 呢?
b标记一下,万一以后自己碰到了呢
刨根问底,有头脑有技术,赞!
好厉害的博主
我的换个主题就能刷新出来了 不知道是咋回事
那就不晓得了…
不知道咋回事 就是有点麻烦了
嗯,现在正常解析出来了
我记得我的RSS输出也是这个问题,后来用notepad++编辑另存为无BOM模式,就正常了。
这个bug确实很难发现
来看看,网站样式换的不错,觉得很赞
我用的 tiny tiny rss + Reeder,一直很正常
wow,我也要自建一个了。
有一年了吗??没觉得诶。
你是用 Feedly 吗,有的阅读器解析起来好像没问题。
inoreader,大多数时候用网页版。
以前也发生过,不过很久没发生了啊。
Mojave+Chrome70.0
我前几天刚升的 Mojave,刚测试了下,问题还是存在的。
竟然发现了18年我的评论。
我想说,后来换火狐了。