Unicode是啥?
Unicode为世界上所有字符都分配了一个唯一的数字编号,这个编号一般写成16进制。Unicode就相当于一张表,建立了字符与编号之间的联系。
UTF8,UTF16,UTF32是啥?
Unicode本身只规定了每个字符的数字编号是多少,并没有规定这个编号怎么存储。编号就通过“UTF-8,UTF-16,UTF-32”对应到二进制进行存储。
UTF-32
这是三个当中最简单的,就是字符的Unicode所对应的二进制形式,一个符号4个字节。比如马的Unicode为:U+9A9C,那么直接转化为二进制,它就表示为1001 1010 0110 1100。需要说明是的是转化成二进制之后计算机的存储问题。主要有两种方式:大端法和小端法。大端法就是讲高位字节放到底地址处。如果不分大小端的话,会造成解读错误。
UTF-16
UTF-32和UTF-16就明显的不一样了。UTF-16使用变长字节表示
①当编号在U+0000-U+FFFF之间的字符(常用字符集),直接用两位字节表示
②编号在U+10000到U+10FFFF之间的字符,就需要用四位字节表示了。
同样,这个也需要区分大小端。
UTF-8
UTF-8是根据Unicode编号的大小来使用从1-4不等的字节数,当然,Unicode的编号越小,所用的字节就少。
UTF-8的编码规则:
①对于单字节的符号,字节的第一位设为0,后面的7位为这个符号的Unocode码,因此对于英文字母,UTF-8编码和ASCII码是一样的。
②对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1设为0,后面字节的前两位一律设为10,剩下的没有提及的二进制位,全部为这个符号的Unicode码。
举个例子:
比如说一个字符的Unicode码是130,显然按照UTF-8的规则,这个需要两个字节(一个字节8个比特,两个字节16个比特)第一个字节的前2位设为1,第3位设为0,则第一个字节为:110X XXXX,后面字节的前两位一律设为因为后面只剩下一字节,所以后面的字节为:10XX XXXX,所以它的格式为:110X XXXX 10XX XXXX。
Unicode和UTF-32、UTF-16、UTF-8的关系。
本质上,UTF-32、UTF-16、UTF-8都是Unicode的一种实现。
(来源:本文参考了zhusongziye博主的“你真懂Unicode和UTF-8是什么关系吗?来看看这个彻底懂了!”)