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

起因

通过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

特殊字符\u2028导致的Javascript脚本异常的更多相关文章

  1. chrome调试 JavaScript 脚本

    随着 JavaScript 应用的复杂性逐渐提高,开发者需要有力的调试工具来帮助他们快速发现问题的原因,并且能高效地修复它.Chrome DevTools 提供了一系列实用的工具使得调试 JavaSc ...

  2. JavaScript脚本语言基础(二)

    导读: JavaScript条件语句 JavaScript循环语句 JavaScript网页中错误捕获 JavaScript的Break和Continue命令 JavaScript的转义字符 1.Ja ...

  3. 调试 JavaScript 脚本

    随着 JavaScript 应用的复杂性逐渐提高,开发者需要有力的调试工具来帮助他们快速发现问题的原因,并且能高效地修复它.Chrome DevTools 提供了一系列实用的工具使得调试 JavaSc ...

  4. javascript脚本混淆

    javascript脚本混淆  脚本病毒是一个一直以来就存在,且长期活跃着的一种与PE病毒完全不同的一类病毒类型,其制作的门槛低.混淆加密方式的千变万化,容易传播.容易躲避检测,不为广大网民熟知等诸多 ...

  5. JavaScript脚本语言基础(四)

    导读: JavaScript和DOM DOM文档对象常用方法和属性 DOW文档对象运用 JSON数据交换格式 正则表达式 1.JavaScript和DOM [返回] 文档对象模型(Document O ...

  6. JavaScript脚本语言基础(一)

    导读: JavaScript代码嵌入HTML文档 JavaScript代码运行方式 第一个实例 JavaScript的三种对话框 定义JavaScript变量 JavaScript运算符和操作符 Ja ...

  7. 浏览器环境下JavaScript脚本加载与执行探析之defer与async特性

    defer和async特性相信是很多JavaScript开发者"熟悉而又不熟悉"的两个特性,从字面上来看,二者的功能很好理解,分别是"延迟脚本"和"异 ...

  8. 对动态加载javascript脚本的研究

    有时我们需要在javascript脚本中创建js文件,那么在javascript脚本中创建的js文件又是如何执行的呢?和我们直接在HTML页面种写一个script标签的效果是一样的吗?(关于页面scr ...

  9. Atitit. Java script 多重多重catch语句的实现and Javascript js 异常机制

    Atitit. Java script 多重多重catch语句的实现and Javascript js 异常机制 1. 语法错误(ERROR)和运行期错误(Exception) 1 2. 错误类型判断 ...

随机推荐

  1. mac搭建lamp环境

    转载:https://www.cnblogs.com/beautiful-code/p/7465320.html

  2. 洛谷P3088 挤奶牛

    传送门啦 这个题也是一个单调队列来优化的 $ dp $ ,我们考虑这个题,这个题让我们求出有多少奶牛会觉得拥挤,如果我们还像琪露诺那个题那样单纯用一次单调队列肯定是不行的,因为牛觉不觉得拥挤是受左右的 ...

  3. kafka基本版与kafka acl版性能对比(单机版)

    一.场景 线上已经有kafka集群,服务运行稳定.但是因为产品升级,需要对kakfa做安全测试,也就是权限验证. 但是增加权限验证,会不会对性能有影响呢?影响大吗?不知道呀! 因此,本文就此来做一下对 ...

  4. C#socket编程序(二)

    在上一篇中,我列了一些常用的方法,可以说这些方法是一些辅助性的方法,对于分析网络中的主机属性非常有用.在这篇中,我将会介绍一下面向连接(TCP)socket编程,其中辅以实例,代码可供下载. 对于TC ...

  5. ansible安装过程遇到的问题

    1.出现Error: ansible requires a json module, none found! SSH password: 192.168.24.15 | FAILED >> ...

  6. 【记录】HTTP协议状态码含义

    状态码200-299之间的状态码表示成功300-399之间的代码表示资源已经被移走400-499之间的代码表示客户端的请求出错500-599之间的代码表示服务器出错了

  7. CSU - 2056 a simple game

    Description 这一天,小A和小B在玩一个游戏,他俩每人都有一个整数,然后两人轮流对他们的整数进行操作,每次在下列两个操作任选一个: (1)对整数进行翻转,如1234翻转成4321 ,1200 ...

  8. String 的常用操作

    String 类,我可以不负责的说在 Java 中这个类应该是使用最频繁的类了.然而关于它的常用的操作,我却不甚了解.整理这个东西很反人性的,这些方法,你看到他的时候感觉很简单,但是真正用的时候还是不 ...

  9. WMRouter:美团外卖Android开源路由框架

    WMRouter是一款Android路由框架,基于组件化的设计思路,功能灵活,使用也比较简单. WMRouter最初用于解决美团外卖C端App在业务演进过程中的实际问题,之后逐步推广到了美团其他App ...

  10. sqlldr 远程数据库

    connect username/password@hostname:port/SERVICENAME select sys_context('USERENV','SERVICE_NAME') fro ...