Unicode, UTF-8 and ASCII 编码问题

编码问题,如何把语言及生活中的符号编码成计算机中的二进制表示出来。其中涉及到码表(code point)和编码方式。

码表就是字符与序号对应的表。例如Unicode和ASCII码就是码表。

编码方式就是怎么把序号编码成二进制的方式。UTF-8就是编码方式。

从码表转换到字节,就是编码(encoding);从字节转换到码表就是解码(decoding)。编码和解码中的规则就是编码方式规定的。在解码的过程中,必须指定编码方式,如果指定的编码方式和原来的编码方式不同,就会出现各种乱码。

Python编码解码示例(来自《Fluent Python》):

>>> s = 'café'
>>> len(s) # 字符串'café'有4个Unicode字符
4
>>> b = s.encode('utf8') # 用UTF-8编码成字节
>>> b
b'caf\xc3\xa9' #
>>> len(b) # é的对应码表在UTF-8中被编码成两个字节
5
>>> b.decode('utf8') # 再用UTF-8解码成字符串
'café'

Unicode实际上是一整套方案,其中包含一个码表,截止2019年5月,已经有137,994字符,包含了150多个现代、古代的字符以及emoji。Unicode还定义了UTF-8、UTF-16、UTF-32等编码方式。但一般提到Unicode都是指其中的码表。
Reference:

The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

Unicode wiki

Fluent Python

posted @ 2019-10-04 23:56  frodo_x  阅读(188)  评论(0编辑  收藏  举报