关于Unicode
几个概念:
Code Point
code point是一个整数值,一般为十六进制。比如0x12ca
写作U+12ca
Character
character是文本的最小基本单位,如A
、B
、C
、你
、我
、他
、+
、-
、!
、。
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 Format
,8
代表编码使用8bit的数字。
UTF-8有几个很方便的属性:
- 可以处理任何Unicode code point。
- 通过UTF8编码得到的byte串没有内嵌的
0x00
,这避免了字节序的问题,并且兼容c语言字符串相关的函数和那些无法正确处理\0
的协议。 - 兼容古老的ASCII。
- 空间使用率高,大部分的最常使用的字符都可以在2字节内表示。
- 就算由UTF-8编码得到的byte串在传输过程中丢失、损毁信息,也可以很简单的找到下一个code point。