代码之家  ›  专栏  ›  技术社区  ›  klaaspieter

'\u2028'unicode字符上的Javascript分析错误

  •  46
  • klaaspieter  · 技术社区  · 15 年前

    例子:

    <!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 回复  |  直到 15 年前
        1
  •  82
  •   bobince    13 年前

    是的,这是JavaScript语言的一个特性,记录在ECMAScript标准(第3版第7.3节)中,即U+2028和U+2029字符算作行尾。因此,JavaScript解析器将以与换行符相同的方式处理任何未编码的U+2028/9字符。因为不能在字符串文本中添加换行符,所以会出现语法错误。

    JSON.parse ,但JavaScript本身并非如此。

    \u -逃脱那些角色。有的做,有的不做;许多的 \u型 -转义所有非ASCII字符,从而避免了问题。

        2
  •  11
  •   metavida    10 年前

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

    唯一的解决方法是确保服务器在请求JSONP资源时从不返回这些字符。

    我的问题是关于u2028,根据 Douglas Crockford's json2 library

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

        3
  •  2
  •   YOU    15 年前

    你能用一下吗 \u2028 unicode line seperator ,浏览器会认为是真正的换行符一样 \n .

    我们不能这样做

    x = "
    
    "
    

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

        4
  •  -5
  •   Remy Lebeau    15 年前

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