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'