Javascriptparsing错误'\ u2028'的Unicode字符
每当我在我的JavaScript源代码中使用\ u2028字符字面值时,将内容types设置为“text / html; charset = utf-8”,我得到一个javascriptparsing错误。
例:
<!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上testing过了,都出现了同样的问题。
任何想法,为什么发生这种情况,以及如何正确解决这个问题(不删除编码)?
编辑:经过一番研究,具体的问题是使用JSONP返回问题字符。 这是由浏览器,它读取u2028作为换行符,并引发一个string中的无效换行错误。
是的,这是JavaScript语言的一个特性,在ECMAScript标准(第三版第7.3节)中有记载,U + 2028和U + 2029字符被视为行结尾。 因此,JavaScriptparsing器将会像换行符一样处理任何未编码的U + 2028/9字符。 既然你不能把一个换行符放在string里面,你会得到一个语法错误。
这是JSONdevise中的一个不幸的疏忽:它实际上并不是JavaScript的真正子集。 原始U + 2028/9字符在JSON中的string文字中是有效的,并且将被JSON.parse
接受,但在JavaScript本身中不是这样。
因此,如果您确定明确地使用JSONparsing器来生成JavaScript代码,则只能安全地使用这些字符。 有些做,有些不做; 许多\u
所有非ASCII字符,避免了这个问题。
好的,回答我自己的问题。
通常,JSONparsing器会去掉这些问题字符,因为我正在检索JSONP,而不是使用JSONparsing器,而是一旦调用callback,浏览器就试图parsingJSON本身。
解决这个问题的唯一方法是确保服务器在请求JSONP资源时永远不会返回这些字符。
ps我的问题是关于u2028,根据道格拉斯克罗克福德的json2库所有下列字符可能会导致这些问题:
'\ u0000的\ u00ad \ u0600- \ u0604 \ u070f \ u17b4 \ u17b5 \ u200c- \ u200f \ u2028- \ u202f \ u2060- \ u206f \ ufeff \ ufff0- \ uffff'
你可以使用\u2028
,而不是真正的字符吗?,因为U + 2028是unicode行分隔符 ,浏览器会认为像\n
这样的真正的换行符。
我们不能这样做
x = " "
对? 但是我们做x = "\n"
,所以可能是相同的概念。
那么,这是有道理的,因为你告诉浏览器,HTML和脚本都使用UTF-8,但是你指定一个不是UTF-8编码的字符。 当你指定“charset = UTF-8”时,你可以确保传输给浏览器的字节实际上是UTF-8。 在这种情况下,Web服务器和浏览器不会为你做。