深色模式
弄懂 Unicode
两个概念:编码字符集与字符编码表
- 编码字符集
- 字符编码表
ASCII
一共定义128个字符
GB2312
用2个大于127的字节表示一个汉字,共可以表示7000多个汉字。
GBK
在GB2312的基础上,不再要求2个字节都大于127,只要求前面的字节大于127即可。增加了约20000个汉字。
GB18030
在GBK的基础上增加了少数民族文字。
DBCS
GB2312、GBK、GB18030统称为DBCS,即双字节字符集。
最大特点是,双字节的汉字字符和单字节的英文字符并存于同一套编码方案中。
注意:DBCS系列,同时定义了编码字符集和字符编码表。
Unicode
Unicode编码字符集,包含了世界上所有的字符。
Unicode包括17个平面,每个平面可定义65536个字符。
每1个平面叫基本平面,码点范围是U+0000至U+FFFF,剩余16个平面的码点范围是U+010000至U+10FFFF。
Unicode只定义了字符的码点,并没有规定用什么样的字节序列来表示这些码点,具体的表示方法由字符编码方式决定。
UTF-32编码方式,是最简单又最浪费存储空间的编码方式,每个字符统一用4个字节来表示。
UTF-8和UTF-16都是可变长编码方案。
UTF-8
UTF-8使用1-4个字节表示一个字符。
Unicode 十六进制码点范围 | UTF-8 二进制 |
0000 0000 - 0000 007F | 0xxxxxxx |
0000 0080 - 0000 07FF | 110xxxxx 10xxxxxx |
0000 0800 - 0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx |
0001 0000 - 0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
UTF-16
UTF-16使用2或4个字节表示一个字符。
基本平面中的字符占2个字节,辅助平面中的字符占4个字节。
UTF-32
UTF-32的使用率很低。
JavaScript编码方式
JavaScript使用Unicode字符集。
JavaScript不使用UTF-8、UTF-16或UTF-32编码方式,而是使用UCS-2编码方式。
UCS-2
UCS-2是UTF-16的子集,使用2个字节表示基本平面中的字符,对于辅助平面中的字符则没有表示的方法,简单说就是UCS-2不认识辅助平面中的字符。
这造成了JavaScript中许多字符处理函数会有bug。
Emoji表情
Mysql的UTF-8
Mysql默认的UTF-8其实是utf8mb3,最大支持3个字节,导致有些字符插入数据库失败。
所以使用Mysql的时候要使用utf8mb4,才是真正的UTF-8。