每当我在我的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作为换行符读取并抛出有关字符串中无效换行符的错误。
答案 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服务器和浏览器不会为您执行此操作。