unicode与UTF8区别

Unicode是一个字符集,保证全球各个国家的字符都能有唯一的二进制码,UTF-8 是 Unicode 字符集的一种实现方式。

那么疑问来了,Unicode已经统一了全球字符,为啥还需要UTF-8呢?

我们说Unicode字符“通常”只有2个字节,但Unicode的字节长度是可以扩展的,以支持那些还未出生的字符(如果将来发现火星上也有人类并且想和我们交流),因此在编码时,单纯地使用Unicode字符集的原始值,就会出现在解码的时候,遇到一行二进制串,不知道一次到底得截取几个字节来翻译成字符,比如6个字节的字节串,它可能对应3个字符也可能2个。

于是乎,在使用Unicode字符集时,采取一种策略来支持不同长度字节的识别就成了一个刚需,这个时候UTF-8这种编码方式就粉墨登场了,基于Unicode字符集,通过特殊的“前缀码”来规定一个字符需要占用几个字节,恰好这个策略也完美兼容了单字节的Ascii码,规则如下:

对于字符"A" ,16进制0041在第一个区间,则编码为01000001 ;

对于字符"中",16进制为4E2D,在00000800 - 0000FFFF区间,所以编码之后为3个字节11100100 10111000 10101101


假如解码时,遇到以下字节串:

01000001 11100100 10111000 10101101

对于UTF-8来说,是这样解码的:

1,按顺序,先遇到第1个字节01000001,因为第1位二进制码是0,于是根据规则,断定当前字符的编码是1个字节,然后取出Unicode值1000001,翻译出字符“A”;

2,接着走,再遇到第2个字节11100100,因为前4位二进制码是1110,于是根据规则断定当前字符的编码是3个字节,匹配 1110xxxx 10xxxxxx 10xxxxxx后,取出Unicode值为 01001110 00101101,翻译出字符“中”;

到底谁用了更多的字节?

UTF-8还解决了另一个刚需,通过变长字节降低了冗余。这个似乎对老美们更有利,英文1个字节,汉字却需要3个。谁叫他们先发明了计算机并且英文加上符号才百把多个,不像我大中国拥有上万的汉子,先决和后决条件都注定我们需要拥抱长字节。

然而万物都是平衡的,大多数情况下,一个英文字符不能表示一个词义,因此同样表达一个意思,有时候他们比我们需要更多的字节,比如为了表达“美”这个词义,汉语一个字3个字节,老美就不行了,不管是用“beautiful”,还是"pretty" 都远远大于3个字节,所以算下来大家都还差不多。


nickname
content