在研究Unicode和utf-8编码的同时,
我注意到utf-8编码的第129个Unicode以0xc2开头。
我检查了0xcf的最后一个字母。
没有 Unicode 将 0xc1 编码为 0xc1。
为什么第 129 个 unicode 是从 0xc2 开始而不是从 0xc1 开始?
八位字节值 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....
| 归档时间: |
|
| 查看次数: |
1256 次 |
| 最近记录: |