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

时间:2010-06-03 11:04:44

标签: 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>

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

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

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

4 个答案:

答案 0 :(得分: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代码是唯一安全的 - 逃避这些字符。有些人有,有些则没有;许多\u - 转义所有非ASCII字符,这可以避免这个问题。

答案 1 :(得分:11)

好的,回答我自己的问题。

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

修复它的唯一方法是确保服务器在请求JSONP资源时永远不会返回这些字符。

P.S。 我的问题是关于u2028,根据Douglas Crockford's json2 library,以下所有字符都可能导致这些问题:

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

答案 2 :(得分:2)

你可以使用\u2028而不是真正的角色吗?因为U + 2028是unicode line seperator,浏览器会认为它是真正的换行符,如\n

我们不能这样做

x = "

"

右?但是我们x = "\n",所以可能是相同的概念。

答案 3 :(得分:-4)

嗯,这是有道理的,因为您告诉浏览器HTML和脚本都使用UTF-8,但是您指定的字符不是UTF-8编码的。当您指定“charset = UTF-8”时,您可以确保传输到浏览器的字节实际上是UTF-8。在这种情况下,Web服务器和浏览器不会为您执行此操作。