字符编码:UCS-2 和 UFT-8
备注:本文修订于2021年3月18日
1、什么是字符编码?
为每一个字符而非字形定义唯一的数字,即为字符编码。例如,可以将“汉”编码成6C49。字符编码是数字,而且是整数。
2、谁在负责字符编码?
历史上存在两个独立的尝试创立单一字符集的组织,即国际标准化组织(ISO)和多语言软件制造商组成的统一码联盟。
ISO 开展了 ISO/IEC 10646 项目,名字叫“Universal Multiple-Octet Coded Character Set”,简称UCS。例如“汉”字的UCS编码是6C49。
统一码联盟开展了Unicode项目,中文叫万国码或者统一码。在表示一个Unicode的字符时,通常会用“U+”然后紧接着一组十六进制的数字来表示这一个字符。例如“汉”字的Unicode编码是U+6C49。
两个独立的组织,竟然选择了同一个数字6C49来代表“汉”,真有这么巧合吗?不是的。因为两者进行了统一。
3、字符编码是如何存储的?
无论是UCS还是Unicode只是规定如何编码,并没有制定出如何传输和保存这个编码的统一规范。因此,进入了百家争鸣(混乱不堪)的时代,甚至自身内部还存在多种编码相互倾轧。
UCS规定了两种存储格式:UCS-2和UCS-4,前者占用两个字节,而后者占用四个字节。由于UCS采用两字节或四字节为一个表示单位,导致了“大小端模式”,为日后的混乱埋下了隐患。
Unicode吸取了UCS的教训,决定采用变长存储,以字节为单位,避免了顺序之争,这就是UTF。UTF是Unicode Transformation Format的缩写,意为Unicode转换格式。UTF下分多个种类,其中,UTF-8是UTF中最常用的转换格式,由Ken Thompson于1992年创建,下文会有详细介绍。
4、UTF的工作原理是什么?
UTF是变长存储,以字节为单位,工作原理是这样的:
第一步:计算机读入一个字节,判断一下,此字节是否能表示某个字符。
第二步:如果能表示出某个字符,则显示出这个字符,然后继续执行第一步;否则,读入下一字节,追加在前面读入的字节之后,判断是否能显示出某个字符,如果不能则继续读,继续判断,直到能表示某个字符为止,最后继续执行第一步。
5、UTF-8编码是什么?
UTF-8用1到6个字节编码Unicode字符。UTF-8标准有如下规定:
(1)所有以0开始的字节,都与原来的ASCII码兼容,也就是说,0xxxxxxx不需要额外转换,就是我们平时用的ASCII码。
(2)所有以10开始的字节,都不是Unicode的第一个字节,都是紧跟着前一位。例如:10110101,这个字节不可以单独解析,必须通过前一个字节来解析,如果前一个也是10开头,就继续前溯。
(3)所有以11开始的字节,都表示是Unicode的第一个字节(车头字节),而且后面紧跟着若干个以10开头的字节。到底紧跟多少个以10开头的字节呢?可以通过“车头字节”中1的个数来判定。例如:如果是110xxxxx(就是最左边的0的左边有2个1),代表后面还有1个10xxxxxx;如果是1110xxxx(就是最左边的0的左边有3个1),代表后面还有2个10xxxxxx;以此类推,一直到1111110x。
UTF-8编码的具体细节如下所示:
1字节 0xxxxxxx
2字节 110xxxxx 10xxxxxx
3字节 1110xxxx 10xxxxxx 10xxxxxx
4字节 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
5字节 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
6字节 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
站长点评:各位徒弟们,大家注意了,深刻理解字符编码并展开想象与联想,就等于掌握了一门绝活儿。即将受益匪浅啊!