特殊字符u2028导致的Javascript脚本异常
情景描述
特殊字符\u2028导致的Javascript脚本异常
JSONP请求的时候返回的是一个Js方法,如果其结果对象的属性值含有非法字符的话,浏览器解析失败就会报错。
常见于文章内容,textarea的输入。
解释
\u2028是一个神奇的字符,是行分隔符,会被浏览器理解为换行,而在Javascript的字符串表达式中是不允许换行的,从而导致错误。
浏览器上表现为一个小点,并且在编辑器里并不会显示出来,浏览器也不会加以解析
// 中和控之间就插入了那个特殊的字符
{"summary":"中
控台彩色大屏"}
解决方法
把特殊字符转义替换即可,代码如下所示:
str = str.replace("\u2028", "\\u2028");
替换后,用之前有问题的文章测试,加载正常,问题解决。
unicode 中的特殊字符部分展示如下,建议都进行转义处理
Unicode | 字符值 | 转义序列 | 含义 | 类别 |
---|---|---|---|---|
\u0008 | \b | Backspace | ||
\u0009 | \t | Tab | 空白 | |
\u000A | \n | 换行符(换行) | 行结束符 | |
\u000B | \v | 垂直制表符 | 空白 | |
\u000C | \f | 换页 | 空白 | |
\u000D | \r | 回车 | 行结束符 | |
\u0022 | " | 双引号 (") | ||
\u0027 | \‘ | 单引号 (‘) | ||
\u005C | |反斜杠 () | |||
\u00A0 | 不间断空格 | 空白 | ||
\u2028 | 行分隔符 | 行结束符 | ||
\u2029 | 段落分隔符 | 行结束符 | ||
\uFEFF | 字节顺序标记 | 空白 |
根据 json2 这个库,需要过滤的字符如下:
var reg = /[\\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
reg.test('中
控台彩色大屏') // true,中和控之间是插入了那个特殊字符的
reg.test('中\u2028控台彩色大屏') // true,等价于上面的。
reg.test('中控台彩色大屏') // false