为什么不在UTF-8中将十六进制值C181表示为大写A?

时间:2019-04-26 18:53:29

标签: utf-8

一个2字节的UTF-8字符为有效载荷提供11位:

110x xxxx 10xx xxxx

我知道这不是很有效,但是为什么有效负载不能在较低范围内,例如'A'= 65?

65 decimal = 1000001 binary

two-byte template: 110_ ____ 10__ ____
payload:                   1   00 0001
result:            1100 0001 1000 0001

2 个答案:

答案 0 :(得分:3)

根据Wikipedia,该标准特别禁止这样做。尽管UTF-8算法允许您通过零填充使用多余的字节,但该标准规定代码点和编码字节序列之间存在一对一的映射。

像您呈现的那样的超长编码被视为无效的字节序列。

同样,即使算法可以使您达到U+10FFFF,也不允许您对U+7FFFFFFF以上的代码点进行编码。 但是,您 可以对尚未分配的代码点进行编码(即,尚无意义的代码)。

答案 1 :(得分:1)

这是安全隐患。允许软件解释“非最短格式” UTF-8会阻止准确而有效的字符串检查。 “ DROP T [41] BLE”不应与“ DROP T [C181] BLE”相同。如果将不良的UTF-8在使用前转换为良好的UTF-16,则会埋葬这种实现方式的问题。

http://www.unicode.org/versions/corrigendum1.html

(特别感谢lenz为我指出了有用的搜索字词。)