这原本是个小错误,但排查花了不少时间,因此写下来和大家分享一下。
起因
通过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。