第一个定义:UTF-8 将 Unicode 代码点编码为 1 到 6 个字节的序列。
0x30C0 使用十六进制表示法表示 2 个字节。假设字节序列中首先出现的高位字节,这相当于 0x30 后跟 0xC0。你可以用 Python 3 来写:
>>> seq = b"\x30\xC0"
>>> seq
b'0\xc0'
假设这可能是一个 UTF-8 编码的字节流,我们可以试试decode 方法:
>>> seq.decode("UTF-8")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc0 in position 1: invalid start byte
???不工作。该序列不是正确的 UTF-8。
让我们为下一个序列做同样的事情:
>>> seq = b"\x30\x3C"
>>> seq.decode("UTF-8")
'0<'
啊,啊!没有例外。这是正确的 UTF-8,对应于 2 个代码点的字符串 0<。
第三个很有趣:
>>> seq = b"\xE0\xAD\xAA"
>>> seq.decode("UTF-8")
'୪'
>>> len(seq.decode("UTF-8"))
1
这 3 个字节仅用于编码一个代码点。
但这是哪个字符……嗯……“代码点”? Python 有 ord 函数知道:
>>> ord(seq.decode("UTF-8"))
2922
代码点 2922(十进制)。那是十六进制...
>>> "{:04X}".format( ord(seq.decode("UTF-8")) )
'0B6A'
因此字节序列0xE0 0xAD 0xAA 编码为UTF-8 Unicode 代码点U+0B6A。但那是哪个角色? Python 嵌入了一个模块来查询 Unicode 数据库:
>>> import unicodedata
>>> unicodedata.name( seq.decode("UTF-8") )
'ORIYA DIGIT FOUR'
原来如此:这是digit 4 in Oriya writing system对应的代码点。