特殊字符\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 字节顺序标记 空白

延伸阅读

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,286评论 19 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,805评论 25 709
  • 小儿的鼻炎季节性比较明显,大多数发生在秋冬季节,因为冬季气候寒冷空气干燥小孩正处在生长发育期,免疫机制还不完善,抵...
    鼻炎聖手王老五阅读 300评论 0 0
  • 大周的太子李深嘉已经行了冠礼,皇后越发着急他的婚事了,这样的天之娇子,什么样的女子才能配的上呢,大臣的家眷私下里也...
    可爱深红爱浅红阅读 262评论 0 0
  • 看到这个问题立刻想到了那些年送过的礼物,遂搜索我的淘宝分享之; 我想礼物最重要的属性是“走心”,无论价值高低,走心...
    Y小姐的空气生活阅读 3,435评论 10 149