HTML、CSS、JS对unicode编码字符的规则
HTML、CSS、JS对unicode编码字符的规则
HTML、CSS和JS对unicode编码字符的规则是不同的,下面通过一个例子来说明有什么不同
代码
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>例子</title>
<script type="text/javascript">
console.log("\u4f60");
</script>
<style type="text/css">
h1:after{
content:"\597d";
}
</style>
</head>
<body>
<h1>你</h1>
</body>
</html>
运行截图
JS对unicode编码字符的规则
JS代码里面的unicode编码字符的语法是:\uXXXX
也就是:斜杠+字母u+四位数十六进制编码
比如:
你 ······>\u4f60
好 ······>\u597d
这种表示法只限于码点在\u0000~\uFFFF之间的字符。超出这个范围的字符,必须用两个双字节的形式表示:
"\uD842\uDFB7"
// "????"
"\u20BB7"
// " 7"
上面代码表示,如果直接在\u后面跟上超过0xFFFF的数值(比如\u20BB7),JavaScript 会理解成\u20BB+7。由于\u20BB是一个不可打印字符,所以只会显示一个空格,后面跟着一个7。
ES6 对这一点做出了改进,只要将码点放入大括号,就能正确解读该字符。
"\u{20BB7}"
// "????"
"\u{41}\u{42}\u{43}"
// "ABC"
let hello = 123;**加粗样式**
hell\u{6F} // 123
'\u{1F680}' === '\uD83D\uDE80'
// true
上面代码中,最后一个例子表明,大括号表示法与四字节的 UTF-16 编码是等价的。
有了这种表示法之后,JavaScript 共有 6 种方法可以表示一个字符。
'\z' === 'z' // true
'\172' === 'z' // true,ASCII中z的编码为122,因此这是一个八进制表示
'\x7A' === 'z' // true,这是ASCII的16进制表示
'\u007A' === 'z' // true
'\u{7A}' === 'z' // true
那么,超出\u0000~\uFFFF这个范围的字符,如何转化为两个双字节的形式表示呢?
对于大于0xFFFF(0x表示十六进制)的字符,先减去0x10000,然后转换为20bit的二进制数,然后分别填充两个码点空出的10bit,这就是需要两个码点字符的保存方式。
第一个码点是0b110110(0b表示二进制)
第二个是0b110111
例子:
\u{1F680}转化为\uD83D\uDE80的过程如下
0x1F680-0x10000结果为0xF680
0xF680转化为2进制结果为0b1111 0110 1000 0000
补全为20位的二进制数0b0000 1111 0110 1000 0000(前面加4个0)
填充两个码点空出的10bit,第一个码点填充为0b110110 0000 1111 01(加粗部分为填充部分)
第二个码点填充为0b110111 10 1000 0000
将两个填充后的码点转化为十六进制即为0xD83D和0xDE80
CSS对unicode编码字符的规则
CSS代码里面的unicode编码字符的语法跟JS的差不多,只是把中间的那个字母u去掉:\XXXX
也就是:斜杠+四位数十六进制编码
比如:
你 ······>\4f60
好 ······>\597d
HTML对unicode编码字符的规则
HTML代码里面的unicode编码字符的语法是:&#XXXX;
也就是:符号&+符号#+十进制编码+英语分号;
比如:
你 ······>你
好 ······>好
这里英语分号测试了一下,不加也可以,但是最好还是加一下
十进制编码是unicode编码的十六进制编码转换来的