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