作为开发人员,编写代码的时候,总归是离不开编码的,我们常见的编码格式有ASCII码,GBK,Unicode, UTF-8,平常最常见的场景就是Unicode与UTF-8之间的互转,ASCII编码一套标准的信息交换表,GBK编码也称国标,是为了方便中文用户使用。
Unicode编码
- 万国码,为了解决各个国家之间字符不同的矛盾,它的机制是转换为字节类型的,然后各个国家用自己的编码进行解码,Unicode是以两个字节编码一个字符,所以不支持ASCII码表。
- Unicode 为世界上所有字符都分配了一个唯一的数字编号,这个编号范围从 0x000000 到 0x10FFFF (十六进制),有 110 多万,每个字符都有一个唯一的 Unicode 编号,这个编号一般写成 16 进制,在前面加上 U+。例如:
“马”
的 Unicode 是U+9A6C
。 - Unicode 本身只规定了每个字符的数字编号是多少,并没有规定这个编号如何存储。所以**
编号怎么对应到二进制表示
**呢?有多种方案:主要有 UTF-8,UTF-16,UTF-32。 - 那么对于一个具体的 Unicode 编号,具体怎么进行 UTF-8 的编码呢?
Unicode转UTF-8
-
首先找到该 Unicode 编号所在的编号范围,进而可以找到与之对应的二进制格式。
-
然后将该 Unicode 编号转化为二进制数(去掉高位的 0),最后将该二进制数从右向左依次填入二进制格式的 X 中,如果还有 X 未填,则设为 0 。
-
比如:
“马”
的 Unicode 编号是:0x9A6C
,整数编号是 39532,对应第三个范围(2048 - 65535),其格式为:1110XXXX 10XXXXXX 10XXXXXX
,39532 对应的二进制是 1001 1010 0110 1100,将二进制填入进入就为:11101001 10101001 10101100
。
UTF-8编码
- 也称万国码,完善了Unicode的缺点,支持ASCII 码表, 是以三个字节编码一个字符
- 计算机使用0和1来实现存储,比如字符C在通过UTF-8转为二进制:
"01000011"
,那么计算机在显示这个字符的时候,需要经过两个步骤。
- 计算机将二进制
"01000011"
转为10进制,67 - 计算机在Unicode字符集中查找67,找到字符**“C”**