这个网页的头部的第一行是
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
复制代码
所以这个网页的字符集是utf-8.
' '(Character Tabulation)可以写成十进制(dec)或十六进制(hex)编码:
Dec 	
Hex 	
'd'可以写成dec或hex编码:
Bin 1100100
Dec d
Hex d
'ⅆ'可以写成dec或hex编码:
Dec ⅆ
Hex ⅆ
'𝕕'可以写成dec或hex编码:
Dec 𝕕
Hex 𝕕
'❤️'可以写成dec或hex编码:
Dec ❤️
Hex ❤️
最后两种,属于“双字节字元”和“多字节字元”,在这个论坛,MySQL字符集为utf8,所以无法直接存储到数据库,须打开html选项,然后书写对应的编码.实际上,如果直接写在帖子中,会导致帖子内容从这个字符开始被截断,后面的内容都会丢失.
🐶(🐶)写成代理对(surrogate pair)
(显示为空码)
一般地,从U+10000到U+10FFFF的码位会写成“代理对”
lead \ trail
|
DC00
|
DC01
|
…
|
DFFF
|
---|
D800
|
10000 |
10001 |
… |
103FF
|
---|
D801
|
10400 |
10401 |
… |
107FF
|
---|
⋮
|
⋮ |
⋮ |
⋱ |
⋮
|
---|
DBFF
|
10FC00 |
10FC01 |
… |
10FFFF
|
---|
Javascript支持utf-16“代理对”:
下面这个例子,2764和FE0F都不在范围D800-DFFF内,但是居然可以解码出来
按照Wikipedia所说,加上我的理解,𝕕(U+1d555)(是上面举过的第4个例子)可以通过如下计算进行解码:
先将它的hex编码1d555减去100000变成d555,二进制表示为1101010101010101(开头可以补零),然后分割成两段:
上值(upper): 0000110101(上10位值)
下值(lower): 0101010101(下10位值)
最后,把上值加上D800以形成高位,把下值加上DC00以形成低位
upper = parseInt(parseInt('d555',16).toString(2).slice(0,-10),2);//分割它的上10位值
(upper + parseInt('D800',16)).toString(16)
"d835"
lower = parseInt(parseInt('d555',16).toString(2).slice(-10),2);//分割它的下10位值
(lower + parseInt('DC00',16)).toString(16)
"dd55" 于是得到代理对"\uD835\uDD55"
|