
上QQ阅读APP看书,第一时间看更新
2.1.2 UTF-8
UTF-8是一个多字节字符集,它可以表示在Unicode字符集中的每个字符,而且与美国7位ASCII字符集向后兼容。每个UTF-8字符由1~4个字节(请参阅表2.1)表示。如果某个字符仅由1个字节编码,那么此字节最高位是0且其他位包含码值(取值范围为0~127)。如果某个字符由多个字节的序列编码,那么首字节中前导1的位数与序列的总字节数相同,然后紧跟着一个0位,且后面的字节都被标记为一个前导“10”位模式。在字节序列中的其余位拼接成Unicode的码点值(取值范围为0x80~0x10FFFF)。因此,一个具有前导0位的字节是一个单字节码,一个具有多个前导1位的字节是一个多字节序列的首字节,而一个具有前导“10”位模式的字节是一个多字节序列的延续字节。这种字节格式允许检测每个序列的开始,而无须从字符串的开头解码。
表2.1 形式合法的UTF-8字节序列
资料来源:[Unicode 2012]
前128个字符构成基本执行字符集,其中每个字符都是单字节。
UTF-8的解码器有时会成为一个安全漏洞。在某些情况下,攻击者可以通过向它发送UTF-8语法不允许的一个八位字节序列,来利用一个不谨慎的UTF-8解码器。《C安全编码标准》[Seacord 2008]包括“MSC10-C.字符编码方式UTF-8相关的问题”,它描述这个问题以及其他与UTF-8相关的问题。