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

起因

通过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. 【前端vue开发】vue开发watch检测的使用

    <span style="color:#006600;"><div id="app"> <input type="tex ...

  2. java 闭包与回调

    闭包(closure)是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域. 内部类是面向对象的闭包,因为它不仅包含外围类对象(创建内部类的作用域)的信息,还自动拥有一个指向此外围类对象 ...

  3. vector 测试

    vector 测试 */--> div.org-src-container { font-size: 85%; font-family: monospace; } pre.src { backg ...

  4. 涨姿势系列之——内核环境下花式获得CSRSS进程id

    这个是翻别人的代码时看到的,所以叫涨姿势系列.作者写了一个获取CSRSS进程PID的函数,结果我看了好久才看懂是这么一个作用.先放上代码 HANDLE GetCsrPid() { HANDLE Pro ...

  5. WORDPRESS登录后台半天都无法访问或者是访问慢的解决方法

    wordpress登录后台如果打开速度慢,一般分为两部分,第一部分是php虚拟主机的原因,其中主机的原因,又分为很多种情况.第二部分就是WordPress程序本身的问题.这里无忧主机小编主要是讲第二部 ...

  6. 使用CSS3 @media 设置页面自适应

    参考CSS3 @media 查询 如果文档宽度小于 300 像素则修改背景演示(background-color): @media screen and (max-width: 300px) { bo ...

  7. 【LOJ】#2105. 「TJOI2015」概率论

    题解 可以说是什么找规律好题了 但是要推生成函数,非常神奇-- 任何的一切都可以用\(n^2\)dp说起 我们所求即是 所有树的叶子总数/所有树的方案数 我们可以列出一个递推式,设\(g(x)\)为\ ...

  8. Kibana部署及配置(四)

    一.Kibana安装 Kibana 是为 Elasticsearch 设计的开源分析和可视化平台.你可以使用 Kibana 来搜索,查看存储在 Elasticsearch 索引中的数据并与之交互.你可 ...

  9. 8-1 Stacks of Flapjacks UVA120

    题意:  有一叠煎饼在锅里 n n<=30张  每张都有一个数字 代表它的大小    厨师每次可以选择一个数k  把从锅底开始数第k张上面的煎饼全部反过来  即原来的在上面的煎饼现在到了下面   ...

  10. pandas实战——对星巴克数据的分析

    一.实验对象 实验对象为星巴克在全球的门店数据,我们可以使用pandas对其进行简单的分析,如分析每个国家星巴克的数量,根据门店数量对国家进行排序等. 二.数据分析 1.读取数据并获取数据行列数 首先 ...