Unicode 与 ASCII

Unicode 标准描述了 ** 码位(code point) ** 如何表示字符。一个码位的值是在 0 到 0x10FFFF(大约 110 万个值,目前有其中 11 万个被指派)。在这一标准中,一个码位写作 U+265E 来表示拥有值 0x265e的字符(十进制下为 9,822)。
一个 Unicode 字符串是一系列码位(从 0 到 0x10FFFF 或者说十进制的 1,114,111 的数字)组成的序列。这一序列在内存中需要被表示为一组 ** 码元 **,然后 ** 码元 ** 会对应到包含八个二进制位的字节。将 Unicode 字符串翻译成字节序列的规则被称为 ** 字符编码 **,或者 ** 编码 **。
Python 的字符串类型使用 Unicode 标准来表示字符,这使 Python 程序能够正常处理所有这些可能的字符。

UTF-8

UTF-8是最常用的编码之一,Python通常默认使用它。UTF代表“Unicode”转换格式”,而“8”表示在编码中使用8位值。(还有UTF-16和UTF-32编码,但使用频率低于UTF-8。)UTF-8使用以下规则:

  1. 如果代码点< 128,则由对应的字节值表示
  2. 如果代码点是>= 128,那么它将被转换成一个由两个、三个或四个字节组成的序列,其中每个字节的长度在128到255之间。

UTF-8 is one of the most commonly used encodings, and Python often defaults to using it. UTF stands for ”UnicodeTransformation Format”, and the ’8’ means that 8-bit values are used in the encoding. (There are also UTF-16 andUTF-32 encodings, but they are less frequently used than UTF-8.) UTF-8 uses the following rules:

  1. If the code point is < 128, it’s represented by the corresponding byte value.
  2. If the code point is >= 128, it’s turned into a sequence of two, three, or four bytes, where each byte of thesequence is between 128 and 255.

UTF-8 编码规则

UTF-8 是一个非常惊艳的编码方式,漂亮的实现了对 ASCII 码的向后兼容,以保证 Unicode 可以被大众接受。
UTF-8 是目前互联网上使用最广泛的一种 Unicode 编码方式,它的最大特点就是可变长。它可以使用 1 - 4 个字节表示一个字符,根据字符的不同变换长度。编码规则如下:
对于单个字节的字符,第一位设为 0,后面的 7 位对应这个字符的 Unicode 码点。因此,对于英文中的 0 - 127 号字符,与 ASCII 码完全相同。这意味着 ASCII 码那个年代的文档用 UTF-8 编码打开完全没有问题。
对于需要使用 N 个字节来表示的字符(N > 1),第一个字节的前 N 位都设为 1,第 N + 1 位设为0,剩余的 N - 1 个字节的前两位都设位 10,剩下的二进制位则使用这个字符的 Unicode 码点来填充。
根据上面编码规则对照表,进行 UTF-8 编码和解码就简单多了。下面以汉字“汉”为利,具体说明如何进行 UTF-8 编码和解码。
“汉”的 Unicode code point 是 0x6c49(110 1100 0100 1001),通过上面的对照表可以发现,0x0000 6c49 位于第三行的范围,那么得出其格式为 1110xxxx 10xxxxxx 10xxxxxx。接着,从“汉”的二进制数最后一位开始,从后向前依次填充对应格式中的 x,多出的 x 用 0 补上。这样,就得到了“汉”的 UTF-8 编码为 11100110 10110001 10001001,转换成十六进制就是 0xE6 0xB7 0x89。
解码的过程也十分简单:如果一个字节的第一位是 0 ,则说明这个字节对应一个字符;如果一个字节的第一位1,那么连续有多少个 1,就表示该字符占用多少个字节。

总结

UTF-8,UTF-16,UTF-32 此类编码方式不同 指的是将Unicode code point 的十六进制数如何转换成机器存储的二进制数的 转换规则不同。而不是将code point 直接转换成32位的二进制数进行编码和解码的。与ASCII码编码方式不同

Unicode字符集 与 ASCII 字符集 兼容。正是因为UTF-8的这种可变长度字节的规则,将127个ASCII字符放在里Unicode 字符集的前127个区位,使得二进制数值与code point 刚好吻合。

GBK、各个国家的字符集只是对ASCII的扩展,但是相互之间并不通用,字符集和编码方式各不相同。

你可能感兴趣的:(Unicode 与 ASCII)