Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

要命的 2028/2029 字符

  最近遇到一个问题,在一个后台编辑系统中录入了一坨奇奇怪怪的数据,导致前端 JavaScript 执行报出语法错误。排查各种问题后发现是数据本身的问题,最后才找到是 2028 这个字符串搞的鬼。后来越想越觉得可怕,要是这样的脏数据被插入到数据库,那不是要挂成狗?
  首先,JavaScript 的单引号或双引号中的字符串是单行字符串(虽然也可以通过反斜杠接换行来强行折行)。这并没有问题,JavaScript 一直以来都是如此,直到 ES6 的 String Tempalte 才真正支持多行字符串。然后,JavaScript 定义了 \u2028 和 \u2029 这两个字符在 JavaScript 中有着和换行符一样的性质。逻辑上这两个字符确实属于换行,但它们的使用不像 \r \n 那样普遍,以至于很多 IDE 没有将它们解析为换行。但如果从 MS Word 之类的富文本编辑器中复制文本到代码编辑器时偶尔会带上这些奇怪的字符。
  坑:JSON.stringify 不会转义 \u2028 和 \u2029。我觉得应该是 Bug 才对。
  当一个数据通过 JSON.stringify 转换后,如果不是通过 JSON.parse 来解析,而是直接通过 JavaScript 引擎解析的话就会直接语法错误而挂掉。下面这个程序执行的结果是语法错误。
<script> try { eval('"\u2028"'); } catch(e) { document.documentElement.style.color = 'red'; document.write(e.name + ': ' + e.message); } </script>
网名:
3.84.186.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^