特殊字符\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 \b Backspace  
\u0009 \t Tab 空白
\u000A \n 换行符(换行) 行结束符
\u000B \v 垂直制表符 空白
\u000C \f 换页 空白
\u000D \r 回车 行结束符
\u0022 \" 双引号 (")  
\u0027 \' 单引号 (')  
\u005C \\ 反斜杠 (\)  
\u00A0   不间断空格 空白
\u2028   行分隔符 行结束符
\u2029   段落分隔符 行结束符
\uFEFF   字节顺序标记 空白

延伸阅读

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

posted on 2016-04-03 15:51 良村 阅读(...) 评论(...) 编辑 收藏

导航