起因:

通过接口拿到一个带有 \r 字符的文本,然后通过赋值到ejs的文本里,再通过fs.readFileSync读出来,调用nodemailer发送到QQ邮箱,然后在邮件里看到了带=E5, = , =E9诸如此类的特殊字符。

经过:

  1. 打印出fs.readFileSync,再fs.writeFileSync到本地文件,看到了^M
  2. 一开始以为是接口乱码导致了,拼命的改编码,用了iconv的类库。结果【x】
  3. 观察到在linux的控制台输出是正常的,就想着先存一份到本地,再读本地的文件。结果【x】
  4. 观察到打印的接口输出里一直包含着\r字符,尝试用replace方法移除。结果【✔】

文本展示

  • 在qq邮件里的展示效果

再见,布诺太太,我得走了,我女儿明天结婚,我今天还有好多好多工作要做。 =E5 ,那小伙子还在抵抗?

  • 在本地文件的展示效果

再见,布诺太太,我得走了,我女儿明天结婚,我今天还有好多好多工作。^M嗯,那小伙子还在抵抗?

  • 在接口里的展示效果

再见,布诺太太,我得走了,我女儿明天结婚,我今天还有好多好多工作。\r嗯,那小伙子还在抵抗?

实现代码

html.replace(/[\r]/g, "");

感想

  1. 惯性思考,一有问题就找百度,百度后都是一堆的dos2unix转,以及vim下的%s/^M$//g
  2. 期间也直接就是拿来主义, readFileSyncreadFile`函数没查清楚,就直接套
  3. 测试不全面,使用sparkqq邮箱,在spark上没这个问题,在qq邮箱有

计算机系少年
95 声望2 粉丝