Unicode和UTF-8

183 阅读4分钟

本文已参与「新人创作礼」活动, 一起开启掘金创作之路。

Character encodings: Essential concepts (w3.org)

字符集、编码字符集、字符编码

明确区分字符集编码字符集字符编码这三个概念非常重要。

  • 字符集

字符集是书写系统的字母与符号的集合。无论是那一种语言文字符号都是一种字符集(包括人们可能用于特定目的的一个字符集或者一个小学三年级学生所掌握的语言文字符号集)——(这与计算机无关,计算机时无法识别的)。

  • 编码字符集

就是编了码的字符集:是为一组字符集中的每个字符都分配了唯一编号(编码表--字符与编号一一对应)。编码字符集的单位称为码位。码位值表示字符在这个编了码的字符集中所在的位置。

最早的编码字符集叫 American Standard Code for Information Interchange(美国信息交换标准代码),简称 ASCII

  • 字符编码(编码字符集编码

      • 字符编码:就是编码字符集映射到字节的方式,以便在计算机中进行操作。编码字符集里的字符在计算机中存储为一个或多个字节,每一个或每一序列字节代表一特定字符。特定字节或序列字节编码以对应 ( 映射 )要处理的文本字符。
      • 一个编码字符集,有多种字符编码。
      • 现有许多不同类型的字符编码。 如果错用了与存储字节不一致的编码, 结果就是乱码。所以,如要文字内容可以阅读,则要正确标注字符编码,这很重要。
      • ASCII,它的码位值二进制就是其字符编码。

编码字符集是将书写系统的字母与符号编成一张表,如ASCII、Unicode、GB2312、GBK等等,在按其在表中的码位值以一个或多个字节编成字节码(再一次编码),如UTF-8、UTF-16、UTF-32。

  • Unicoide

Unicode 为每个字符提供唯一的数字,无论什么平台,无论程序是什么,无论语言如何。是一个组织,也是一个标准

Unicode 联盟是一个非营利组织,旨在开发、扩展和促进 Unicode 标准的使用,该标准规定了文本在现代软件产品和标准中的表示形式。Unicode 在一个字符集中包含了世界上所有文字和符号,统一编码,来终结不同编码产生乱码的问题。

在 Unicode 中,有多种方法可以对同一字符进行编码。

可与 Unicode 一起使用的编码形式称为 UTF-8、UTF-16 和 UTF-32。

  • UTF-8

UTF-8使用 1 个字节来表示 ASCII 集中的字符,使用 2 个字节表示几个字母块中的字符,使用 3 个字节表示 BMP 的其余部分。增补字符使用 4 个字节。

  • UTF-8 的编码规则如下(U+ 后面的数字代表 Unicode 字符的码位值):
U+ 0000 ~ U+ 007F0XXXXXXX
U+ 0080 ~ U+ 07FF110XXXXX 10XXXXXX
U+ 0800 ~ U+ FFFF1110XXXX 10XXXXXX 10XXXXXX
U+10000 ~ U+1FFFF11110XXX 10XXXXXX 10XXXXXX 10XXXXXX
  • 可以看到,UTF-8 通过开头的标志位位数实现了变长。对于单字节字符,只占用一个字节,实现了向下兼容 ASCII,并且能和 UTF-32 一样,包含 Unicode 中的所有字符,又能有效减少存储传输过程中占用的空间。
  • UTF-8就是为了解决Unicode存在内存问题,将Unicode再次编码的一种编码方式
  • UTF-16

UTF-16对 BMP 中的任何字符使用 2 个字节,对补充字符使用 4 个字节。

  • UTF-32

UTF-32对所有字符使用 4 个字节。

Unicode码位值U+0041U+05D0U+597DU+233B4
UTF-841D7 90E5 A5 BDF0 A3 8E B4
UTF-1600 4105 D059 7DD8 4C DF B4
UTF-3200 00 00 4100 00 05 D000 00 59 7D00 02 33 B4