为什么没有以 0xC1 开头的 Unicode?

0 unicode encoding utf-8

在研究Unicode和utf-8编码的同时,

我注意到utf-8编码的第129个Unicode以0xc2开头。

我检查了0xcf的最后一个字母。

没有 Unicode 将 0xc1 编码为 0xc1。

为什么第 129 个 unicode 是从 0xc2 开始而不是从 0xc1 开始?

Mar*_*nen 5

UTF-8规范,RFC 3629在简介中特别指出:

八位字节值 C0、C1、F5 到 FF 永远不会出现。

原因是 1 字节 UTF-8 序列由 8 位二进制模式0xxxxxxx(零后跟七位)组成,并且可以表示适合七位的 Unicode 代码点(U+0000 到 U+007F) 。

2 字节 UTF-8 序列由 16 位二进制模式组成110xxxxx 10xxxxxx,可以表示适合 8 到 11 位(U+0080 到 U+07FF)的 Unicode 代码点。

在 UTF-8 编码中使用超过所需的最小字节数是不合法的,因此虽然 U+007F 可以用两个字节表示为(十六进制),但它更紧​​凑,因此遵循 1 字节的规范。11000001 10111111C1 BF01111111

第一个有效的两字节值是 U+0080 的编码,即(十六进制),因此和永远不会出现。1100010 10000000C2 80C0C1

请参阅标准中第 3 节UTF-8 定义。最后一段指出:

上述解码算法的实现必须防止解码无效序列。例如,一个幼稚的实现可能会将超长的 UTF-8 序列 C0 80 解码为字符 U+0000....