编码 Unicode 及其在 JavaScript 中的使用(3)

\u 加四位十六进制数 或 \x 加2位十六进制数属于转义字符,在 js 字符串长度中只算 1 个,转义字符不能直接用于 HTML 文件(不会转换后输出,而是直接输出转义格式的字符串),但可以用 document.write()打印出来,因为在 js 语法范围内,虽然表达方式不一样,但是转义字符和直接的字符字面量都是指同一个东西:

console.log("\u0061"==='a');//true
 

('123|u55b5abc').length //12

('123|u55b5abc').split('')//["1", "2", "3", "|", "u", "5", "5", "b", "5", "a", "b", "c"]

('123\u55b5abc').length //7

('123\u55b5abc').split('')// ["1", "2", "3", "喵", "a", "b", "c"]

4、 xss 与 字符编码

当向页面显示用户输入的内容是,通常我们要过滤或转义 script 标签以避免 XSS 攻击,

但是,需要注意的是, \u+16进制 、\x+16进制 、字符实体如果出现在模板中的 HTML 标签属性中就需要特别注意了,他们会正确解码后才赋给标签的属性,例如:

document.body.innerHTML ='<img src="https://www.linuxidc.com/wrongUrl.gif" onerror="&#116;&#104;&#105;&#115;&#46;&#115;&#114;&#99;&#61;&#39;&#104;&#116;&#116;&#112;&#58;&#47;&#47;&#119;&#119;&#119;&#46;&#120;&#115;&#115;&#46;&#99;&#111;&#109;&#39;" >';

对标签属性之进行转义时,需要对注意,是比较下面2个做法:

document.body.innerHTML ='<a>click me</a>';

document.body.innerHTML ='<a>click me</a>';

5、八进制转义字符

js 字符串中,\ 开始后接正数,可能被解析为8进制转义字符。

一个八进制转义字符形成的条件是:斜线后面接的整数最长3位,至少1位,单个数字的字面值不大于8。

如果过不满足任意一项,都将结束一个字符的解释,开始新字符的解释。八进制转义字符的10进制数字字面值最大值为377,即 '\377' 被解析为一个字符,'\378' 被解析为2个字符: '\37' 和 '8' :

'\377'.length //1

console.log('\377')// ÿ

'\378'.length //2

'\128'.length //2

console.log('\127')//W

'W'.charCodeAt(0)//87

(87).toString(8)//'127'

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/f33ac200134dd539ff8172ef8b300cf6.html