为什么只有Unicode是不够的,UTF-8如何解决编码问题?

UnicodeUnicode是一种字符编码标准,它为世界上几乎所有的文字和符号分配了唯一的数字编码 。这使得不同的计算机系统和软件能够正确地显示和处理各种语言的文字 。Unicode采用16位或32位编码,可以表示超过130万个字符 。
「为什么只有Unicode是不够的」

  1. 「编码长度不一致」:在Unicode中,字符的编码长度可以是1个字节、2个字节、3个字节或4个字节,这使得在存储和传输时需要考虑编码长度的不一致性 。
  2. 「存储和传输效率」:由于Unicode字符集非常庞大,使用Unicode编码可能会导致存储和传输效率低下,特别是对于只包含少量字符的文本而言 。
  3. 「兼容性」:许多现有的系统和软件可能仍然使用其他编码方式,如ASCII、ISO-8859等,因此需要与这些编码方式进行兼容 。
举个例子 , 假如我们自己为字符编码,编码规则如下:
a -- 1b -- 2c -- 3...z -- 26如果用上面的编码表示add,结果就是144 。而当我们要表示hello时没结果就是85121215 。此时85121215还可以表示为heababo、heababae、heablo等,此时这个编码结果就不正确了 。
为什么只有Unicode是不够的,UTF-8如何解决编码问题?

文章插图
图片
此时的12和15就可以表示为不同的组合,这就会导致结果差异 。这里仅仅只是表示了26个字母,再加入其他字符的情况下Unicode远远是不够的 。
我们看看UTF-8如何解决上面的编码问题 , 此时有两种思路:
  1. 第一种是固定位数解析:如固定两位解析,不足的补0 。这时 hello的编码结果就为0805121215 。
  2. 第二种是增加标志位:如最简单的加空格,这时hello的编码就是8 5 12 12 15 。
【为什么只有Unicode是不够的,UTF-8如何解决编码问题?】在Unicode中,解决方案叫UTF(Unicode transformation format),有三种编码方式分别是UTF-8、UTF-16、UTF-32 。UTF-32是第一种思路,固定32位解析 , 不足补0;UTF-8、UTF-16则是第二种思路 。
UTF-8UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,它可以用来表示世界上几乎所有的字符 。在UTF-8编码中,每个字符的编码长度可以是1个字节、2个字节、3个字节或4个字节,这使得UTF-8编码非常灵活,可以节省存储空间 。UTF-8编码通过灵活的字节长度来表示Unicode字符,使得它成为一种广泛应用的字符编码方式 。
UTF-8编码的特点:
  • 对于英文字符 , 使用1个字节表示,与ASCII兼容;
  • 对于常见的其他语言(如西欧语言、中文、日文等)的字符,使用2个或3个字节表示;
  • 对于较少使用的字符 , 使用4个字节表示 。
UTF-8使用1至4个字节来表示一个字符 。其编码规则如下:
为什么只有Unicode是不够的,UTF-8如何解决编码问题?

文章插图
图片
  • 对于单字节字符(即ASCII字符),UTF-8编码和ASCII编码是相同的 。
  • 对于多字节字符,UTF-8使用不同的字节序列来表示不同的Unicode码位 。具体规则如下:
  • 对于码位在U+0000至U+007F范围内的字符 , 使用一个字节表示,最高位为0 。
  • 对于码位在U+0080至U+07FF范围内的字符,使用两个字节表示,最高三位为110 。
  • 对于码位在U+0800至U+FFFF范围内的字符 , 使用三个字节表示,最高四位为1110 。
  • 对于码位在U+10000至U+10FFFF范围内的字符,使用四个字节表示,最高五位为11110 。
这种编码方式保证了对于不同范围的Unicode字符,UTF-8编码的字节数是不同的 , 从而实现了对Unicode字符集的高效编码和兼容性 。
我们用汉这个字为例:
**汉**的 Unicode 编码为:U+6C49**汉**对应的二进制为:01101100 01001001汉的Unicode为U+6C49,所以对应规则多字节中的三个字节,此时编码规则为1110xxxx 10xxxxxx 10xxxxxx 。
为什么只有Unicode是不够的,UTF-8如何解决编码问题?

文章插图
图片
将对用的二进制带入编码规则中得到编码为:11100110 10110001 10001001 。


推荐阅读