特殊字符\u2028导致的Javascript脚本异常

这原本是个小错误,但排查花了不少时间,因此写下来和大家分享一下。

起因

通过Ajax动态从后台读取文章内容,并显示在页面上,加载到某篇文章的时候,报javascript语法错误,无法显示文章内容。
Ajax从后台读取时返回的数据格式为Json,使用Newtonsoft.Json库来组装Json。
分析原因
因为其它文章可以正常加载,仅有一篇文章报Javascript语法错误,所以可以大致确定是文章内容导致的异常。把文章内容贴到写字板中仔细查找,发现有几个小黑方块,手工去掉这几个小黑方块后,加载正常。
复制这个方块到程序中,在BigEndianUnicode编码(注:Javascript的编码格式为UCS-2,与BigEndianUnicode兼容)下转换为字节数组,写到控制台上,程序和结果如下:

public void Test1()
{
   string str = @"";
   byte[] bytes = Encoding.BigEndianUnicode.GetBytes(str);
   foreach(byte b in bytes)
   {
      Console.Write(b.ToString("x2"));
   }
}

结果为:2028
网上查询得知,这个编码为2028的字符为行分隔符,会被浏览器理解为换行,而在Javascript的字符串表达式中是不允许换行的,从而导致错误。

解决方法

把特殊字符转义替换即可,代码如下所示:

str = str.Replace("\u2028", "\\u2028");

替换后,用之前有问题的文章测试,加载正常,问题解决。
另外,Javascript中的特殊字符一共有13个,建议都进行转义处理,如下:

Unicode 字符值转义序列含义类别
\u0008\bBackspace
\u0009\tTab空白
\u000A\n换行符(换行)行结束符
\u000B\v垂直制表符空白
\u000C\f换页空白
\u000D\r回车行结束符
\u0022双引号 (“)
\u0027单引号 (‘)
\u005C\反斜杠 ()
\u00A0不间断空格空白
\u2028行分隔符行结束符
\u2029段落分隔符行结束符
\uFEFF字节顺序标记空白

延伸阅读

Javascript特殊字符转义字符对照表
关于Javascript使用的编码格式,可以看这篇文章:Unicode与Javascript详解
为什么Json库返回的结果不能被Javascript正确解析?Javascript parse error on ‘\u2028’ unicode character
Javascript使用的Json库处理特殊字符范例:JSON-js

    原文作者:白水螺丝
    原文地址: https://www.jianshu.com/p/aa825b7f4e73
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞