-
unicode是一个字符集,将所有的不同的字符使用同一集合纳入其中,以统一形式表示。可以简单的将其理解为一个大型字典,其中包含的是一个字符对应的一个码点(数值),二者之间存在着映射的关系。
-
utf-8是一种编码的形式,可以将其理解为unicode的实现形式之一,类似的还有utf-16、utf-32等等。utf-8的最大特点是可变长编码,它的编码形式可以解决之前编码问题中的两大痛点:
Q1:如何能够正确判断多字符的编码形式代表的是一个长字符还是多个短字符呢?
Q2:如果使用定长编码来代表所有字符,虽然可以解决第一个痛点,但是由于对于单字符或者多字符的字符编码长度相同,针对单字符的编码就造成了存储空间的大量浪费,又如何解决该问题?
-
utf-8的具体编码方式:
1、对于单个字节的字符,第一位设为 0,后面的 7 位对应这个字符的 Unicode 码点。因此,对于英文中的 0 - 127 号字符,与 ASCII 码完全相同。这意味着 utf-8是完全可以兼容ASCII的。
2、对于需要使用 N 个字节来表示的字符(N > 1),第一个字节的前 N 位都设为 1,第 N + 1 位设为0,剩余的 N - 1 个字节的前两位都设位 10,剩下的二进制位则使用这个字符的 Unicode 码点来填充。
0xxxxxxx # 单个字符
110xxxxx 10xxxxxx # 两个字符
1110xxxx 10xxxxxx 10xxxxxx # 三个字符
具体拿个例子来说:
“汉”的 Unicode 码点是 0x6c49(110 1100 0100 1001),通过上面的对照表可以发现,需要对两个字符长度进行编码,那么得出其格式为 1110xxxx 10xxxxxx 10xxxxxx。接着,从“汉”的二进制数最后一位开始,从后向前依次填充对应格式中的 x,多出的 x 用 0 补上。这样,就得到了“汉”的 UTF-8 编码为 11100110 10110001 10001001。在这里我用一个更为直观的图片来解释其过程: