到底utf-8和unicode是什么关系

2024-12-14 04:45:44
推荐回答(1个)
回答1:

UTF-8是unicode的一种具体实现。

Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。1990年开始研发,1994年正式公布。它是一种标准,规定了每个字符对应的二进制数,或者称它是一个具体大的映射。但是unicode并没有规定字符对应的二进制数怎么存储,比如字母可能对应的数字很小,那么转换为二进制数需要8位(一个字节)就够了。但是汉字就需要14/15/16位才能表示下也就是最少需要两个字节,甚至有些字符需要三个字节才能表示。

UTF-8就是unicode的一种具体实现,它采用变长方式存储字符,比如需要一个字节就可以表示的字符那就用一位存储,需要二位字节表示的用两个字节存储。这样就可以尽量缩短文件大小,方便文件存储、传输。

UTF-8的编码规则很简单,只有二条:
1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。

eg:
Unicode符号范围 | UTF-8编码方式
(十六进制) | (二进制)
--------------------+---------------------------------------------
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
跟据上表,解读UTF-8编码非常简单。如果一个字节的第一位是0,则这个字节单独就是一个字符;如果第一位是1,则连续有多少个1,就表示当前字符占用多少个字节。

另外,当一个字符需要两个以上字节表示时,比如用“中”的unicode编码是D6 D0,那么具体存储(传输)的时候是D0在前还是D6在前都是可以的,因此就产生了Little endian和Big endian。Little endian就是D0 D6的存储,Big endian就是D6 D0的方式。

总之,你可以这么认为,unicode就好比Java中的接口,它只规定一些规则内容方法,UTF-8是具体的实现,考虑了很多实际的东西。