"\ u2028"unicode字符上的Javascript解析错误

kla*_*ter 48 javascript unicode

每当我在我的javascript源代码中使用\ u2028字符文字,内容类型设置为"text/html; charset = utf-8"时,我会得到一个javascript解析错误.

例:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
   "http://www.w3.org/TR/html4/strict.dtd">

<html lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>json</title>

    <script type="text/javascript" charset="utf-8">
    var string = '?    ';
    </script>
</head>
<body>

</body>
</html>
Run Code Online (Sandbox Code Playgroud)

如果<meta http-equiv>遗漏了,一切都按预期工作.我在Safari和Firefox上测试了这个,两者都表现出同样的问题.

有关为什么会发生这种情况以及如何正确解决此问题的任何想法(不删除编码)?

编辑:经过一些更多的研究,具体问题是使用JSONP返回问题字符.然后由浏览器解释,它将u2028作为换行符读取并抛出有关字符串中无效换行符的错误.

bob*_*nce 75

是的,它是ECMAScript标准(第3版第7.3节)中记录的JavaScript语言的一个特性,即U + 2028和U + 2029字符计为行结尾.因此,JavaScript解析器将以与换行符相同的方式处理任何未编码的U + 2028/9字符.由于您无法在字符串文字中放置换行符,因此会出现语法错误.

这是JSON设计中的一个不幸的疏忽:它实际上并不是JavaScript的合适子集.原始U + 2028/9字符在JSON中的字符串文字中有效,并且JSON.parse在JavaScript本身中将被接受,但不是这样.

因此,如果您确定它明确地使用\u这些字符,那么使用JSON解析器生成JavaScript代码是安全的.有些人有,有些则没有; many \u-escape所有非ASCII字符,避免了这个问题.


kla*_*ter 11

好吧,回答我自己的问题.

通常,JSON解析器会删除这些问题字符,因为我正在检索JSONP我没有使用JSON解析器,而是在调用回调时浏览器尝试解析JSON本身.

解决此问题的唯一方法是确保服务器在请求JSONP资源时永远不会返回这些字符.

ps我的问题是关于u2028,根据Douglas Crockford的json2库,以下所有字符都可能导致这些问题:

'\ u0000的\ u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff'

  • @pvgoddijn https://github.com/douglascrockford/JSON-js/blob/master/json2.js#L195 (3认同)
  • 你有这个清单的来源吗?(Douglas Crockford下的链接在任何地方都没有用) (2认同)