【字符集及字符编码】UTF-8、UTF-16和UTF-32
UTF-32 用 4 个字节存储每一个字符,以保证能把 UCS 完全表达出来。但实际上 UCS 的字符数量根本不需要用 32 位表示,UTF-32 极大地浪费了空间。另外,由于组合字符的存在,定长表示并不能如预期那样迅速地定位字符,反正就是超级不好用。
UTF-16 将 UCS 映射为 16 长的整数,用于数据存储或传输。UCS 的码位,需要 1 个或 2 个 16 位的码来表示,因此这是一个变长表示。另外,UTF-16 也需要指定字节序。Java 和 C# 里的字符串表示就是用的 UTF-16 编码,从而它们的 char 类型跟 short 类型都是 16 位的,需要另外添加一个 byte 类型来表示 8 位字节。
UTF-8 也是一个可变长度字符编码,它同时是一个前缀码,前缀码的特征是,编码系统中的任意一个合法的码不会是另外一个码的前缀,所以 UTF-8 不需要指定字节序。一个 UTF-8 编码可以用 1~6 个字节来表示,将第一个字节的前几个比特设置为 1 来指定这个字符占用几个比特,比如一个两字节的字符的编码,第一位是 110xxxxx,第二位是 10xxxxxx,而一个六字节字符的编码是这样的:1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx,所以 UTF-8 最多能编码 231 个字符。