about_encoding

关于Unicode

几个概念:

Code Point

code point是一个整数值,一般为十六进制。比如0x12ca写作U+12ca

Character

character是文本的最小基本单位,如ABC+-

glyph

glyph是字符在屏幕上的表现形式。

这三者之间的关系

UNICODE_TABLE[code_point] => character

print(character) => 我们在屏幕上看到的东西

编码

Unicode字符串其实就是一串code point,从0到0x10FFFF。

在计算机中,保存数据只能通过二进制来表示,因此这一串code point需要用一组byte来表示。

将Unicode string转化成一串字符串的规则,被叫做编码。

我们现在制造一种编码,用32位表示一个code point,那么”Pyhton”就会被表示为:

   P           y           t           h           o           n
0x50 00 00 00 79 00 00 00 74 00 00 00 68 00 00 00 6f 00 00 00 6e 00 00 00
   0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

这种方法简单粗暴,但是有一些问题:

  • 兼容性不好:不同处理器处理字节的顺序不同。Endian
  • 浪费空间,对于一篇纯英文的文章来说,存储空间要是ascii的四倍。
  • 和C语言的strlen不兼容,因为有\0
  • 很多网络协议是基于文本的,不能处理其中的0x00(\0)。

UTF8

UTF-8 是一种最广泛使用的编码格式。UTF代表着Unicode Transformation Format8代表编码使用8bit的数字。

UTF-8有几个很方便的属性:

  • 可以处理任何Unicode code point。
  • 通过UTF8编码得到的byte串没有内嵌的0x00,这避免了字节序的问题,并且兼容c语言字符串相关的函数和那些无法正确处理\0的协议。
  • 兼容古老的ASCII。
  • 空间使用率高,大部分的最常使用的字符都可以在2字节内表示。
  • 就算由UTF-8编码得到的byte串在传输过程中丢失、损毁信息,也可以很简单的找到下一个code point。

不同编码之间的转换

Encoding In Python